2010-03-10 68 views
3

我有一个python程序,要吃大量的内存,主要是在字典中。这个词典将负责为一个非常大的键集分配一个唯一的整数值。当我处理大型矩阵时,我需要一个键 - 索引对应关系,也可以从中恢复(即一旦矩阵计算完成,我需要将这些值映射回原始键)。操作系统如何处理比内存大的python字典?

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

+0

比物理内存大吗?比交换文件大? “可用内存”是什么意思? – 2010-03-10 20:19:41

回答

0

它只会在交换垃圾中结束,因为散列表具有非常随机的内存访问模式。

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

+2

“打乱”你的意思 – aehlke 2010-04-07 19:45:40

5

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

1

交换空间是内核功能和用户透明(python)。

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

0

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