我在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
中的条目太多了?打开的文件太多了? (这些都是我在询问之前检查过的所有想法,或者只是不适用于我的情况,但也许你明白了。)
有什么想法吗?
答案 0 :(得分:1)
我找到了原因,试图将脚本删除到一个最小的例子(这花了一些时间,因此不是我的第一选择; - )
我使用的值很大read()
,远远大于文件的大小。确切地说,我有这段代码:
with open(filePath) as f:
s = f.read(chunk)
其中chunk
为1 << 30
(1GiB)。这通常会返回整个文件内容,但它可能会在内部首先分配给定大小的非常大的缓冲区,并在读取发生后立即释放它。在运行一段时间后,使用了一些额外的内存,并且如上所述失败。
我尝试使用更大的1 << 40
(1TiB)值,然后一次性获得MemoryError
。
我现在使用s = f.read(min(chunk, fileSize))
替换了代码,因此如果chunk
非常大,则仅使用fileSize
。
尽管如此,谢谢大家的考虑!