4

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

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

4

4 回答 4

5

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

于 2010-03-10T20:17:03.227 回答
2

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

如果你确实有一个巨大的字典并且不需要一次所有的数据,你可以看看redis可能会做你想做的事。或者可能不是 :)

于 2010-03-10T20:17:17.480 回答
1

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

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

于 2010-03-10T20:17:29.247 回答
1

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

于 2010-03-10T20:19:33.433 回答