【问题标题】:How does OS handle a python dict that's larger than memory?操作系统如何处理大于内存的python dict?
【发布时间】:2010-03-10 20:11:32
【问题描述】:

我有一个 python 程序会占用大量内存,主要是在字典中。这个 dict 将负责为一组非常大的键分配一个唯一的整数值。当我使用大型矩阵时,我需要一个键到索引的对应关系,也可以从中恢复(即,一旦矩阵计算完成,我需要将值映射回原始键)。

我相信这个数量最终会超过可用内存。我想知道如何处理交换空间。或许有更好的数据结构用于此目的。

【问题讨论】:

  • 大于物理内存?比交换文件大? “可用内存”是什么意思?

标签: python memory data-structures matrix swap


【解决方案1】:

你需要一个数据库,如果数据会超出内存。当字典大于内存时,字典的索引并不是为了获得良好的性能而设计的。

【讨论】:

    【解决方案2】:

    交换空间是一个内核特性,对用户是透明的 (python)。

    如果您确实有一个巨大的字典并且不需要一次所有数据,您可以查看redis,它可能会满足您的需求。或者也许不是:)

    【讨论】:

      【解决方案3】:

      它最终会导致交换垃圾,因为哈希表具有非常随机的内存访问模式。

      如果您知道映射超出了物理内存的大小,您可以考虑首先在磁盘上使用数据结构。特别是如果您在计算过程中不需要数据结构。当哈希表触发交换时,它也会在哈希表本身之外产生问题。

      【讨论】:

      • python中有哪些数据结构使用磁盘存储?
      【解决方案4】:

      据我所知,当扩展字典时,它只依赖于 C 的 malloc。只要 malloc 继续成功,程序就会继续运行。只要有足够的内存,大多数操作系统都会让 malloc 继续工作,然后只要有可以换入的页面。在任何一种情况下,当 malloc 失败时,Python 都会抛出 MemoryError 异常,根据documentation。就数据结构而言,dict 在空间方面将非常有效。真正做得更好的唯一方法是使用分析函数来回映射值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多