我有一个python程序会占用大量内存,主要是在dict中。该dict将负责为一组非常大的键分配唯一的整数值。当我使用大型矩阵时,我需要一个也可以从中恢复的密钥到索引的对应关系(即,一旦矩阵计算完成,我需要将值映射回原始密钥)。
我相信这个数量最终会超过可用内存。我想知道如何处理交换空间。也许为此目的有一个更好的数据结构。
答案 0 :(得分:5)
如果数据超出内存,则需要数据库。当字典大于内存时,字典的索引不是为了获得良好的性能而设计的。
答案 1 :(得分:2)
交换空间是一个内核功能,可以移植给用户(python)。
如果您确实拥有一个巨大的字典并且不需要同时获取所有数据,那么您可以查看redis哪些可能会执行您想要的操作。或许不是:)。
答案 2 :(得分:1)
它最终将在交换垃圾中,因为哈希表具有非常随机的内存访问模式。
如果您知道地图超出了物理内存的大小,您可以考虑首先在磁盘上使用数据结构。特别是如果您在计算过程中不需要数据结构。当哈希表触发交换时,它也会在哈希表本身之外产生问题。
答案 3 :(得分:1)
据我所知,当dict扩展时,它只依赖于C的malloc。只要malloc保持成功,程序就会继续运行。只要有足够的内存,大多数操作系统都会保持malloc工作,然后只要有可以交换的页面。在任何一种情况下,当malloc失败时,Python会根据documentation抛出一个MemoryError异常。就数据结构而言,dict在空间方面将非常有效。真正做得更好的唯一方法是使用分析函数来回映射值。