没有内存消耗的Python MemoryError

时间:2014-05-28 15:03:04

标签: python out-of-memory

我在Python脚本中反复得到一个MemoryError异常,它不应该存储太多以至于内存不足。此外,使用top之类的东西在我的Linux系统上查看它也表明它不会消耗大量内存:top显示内存使用率为0.9%(从0.0%稳步增长),而其他进程占用大约10%的内存使用量,所以这似乎不是原因。问题也是可重复的,并且总是发生在同一个地方,所以它似乎并不依赖于整个系统内存负载。

具体而言,read()命令抛出异常,该命令应将最近打开的文件中的~64k数据读入内存。

我正在使用一个数据结构,该数据结构会增长,而defaultdict存储int指向list的{​​{1}} {1}}秒。我们在一起谈论44028 str s,260830 int和所有list中的21073549个字符。我想这不应该爆炸我的系统。

我在SO上搜索过这样的现象,但没有发现任何其他类似我的情况的问题。

是否有已知的效果可以使进程具有str而没有真正使用大量内存?也许某种堆栈溢出?使用的发电机太多了? MemoryError中的条目太多了?打开的文件太多了? (这些都是我在询问之前检查过的所有想法,或者只是不适用于我的情况,但也许你明白了。)

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我找到了原因,试图将脚本删除到一个最小的例子(这花了一些时间,因此不是我的第一选择; - )

我使用的值很大read(),远远大于文件的大小。确切地说,我有这段代码:

with open(filePath) as f:
    s = f.read(chunk)

其中chunk1 << 30(1GiB)。这通常会返回整个文件内容,但它可能会在内部首先分配给定大小的非常大的缓冲区,并在读取发生后立即释放它。在运行一段时间后,使用了一些额外的内存,并且如上所述失败。

我尝试使用更大的1 << 40(1TiB)值,然后一次性获得MemoryError

我现在使用s = f.read(min(chunk, fileSize))替换了代码,因此如果chunk非常大,则仅使用fileSize

尽管如此,谢谢大家的考虑!