1

我正在尝试使用 python 处理一些数据,但经常遇到“MemoryError”。对于我的数据处理,我需要运行大约 400 次循环。问题是,每次我进入这个循环 20-30 次时,我都会得到“MemoryError”。在观看任务管理器时,这似乎发生在 python.exe*32 约为 1 GB 时。我会使用 64 位 python,但我需要的一些库只有 32 位。此外,在每个循环调用的主函数结束时,我对我使用的每个变量都使用了 del 函数。当“MemoryError”发生时,我必须完全退出解释器,否则如果我尝试再次重新运行它,它会自动失败并出现“MemoryError”。

我正在使用 Python(x,y) 2.7 并且需要以下内容: numpy scipy.io matplotlib pyopencl pyfft

4

1 回答 1

4

你说它在这样的一行上崩溃了:

s = zeros((A,B,C),complex128)

A=2400,B=256,C=25。这将需要 235 MB 的内存。而不仅仅是任何 235 MB:它必须是连续的,因为 NumPy 期望将它用作单个数组。

您还提到您在 32 位进程中运行它,并且当进程内存使用量达到 1 GB 左右时它会崩溃。

这是不幸的,但并不完全令人惊讶。考虑到 32 位进程中的总可用虚拟内存在 3 GB 左右,不可避免地会出现一些“漏洞”,这意味着您将永远无法分配 4 GB 大小的单个数组。但是你可以在一件中分配多少?好吧,这取决于您到目前为止分配的内存碎片,因为您的程序仍然需要的虚拟地址可能会“散布”在其 4 GB 地址空间周围,最终您可能无法分配 1/4 GB块在一起。

您应该在这里做的是分配一次矩阵并重用它。当您的程序刚刚启动时,您极有可能成功分配 235 MB 数组,您可以稍后在重用它之前清除它,而无需再次分配。

或者,您可以 (a) 迁移到 64 位,或者 (b) 花费大量时间来跟踪为什么在运行垃圾收集语言一段时间后无法分配大的连续块。

于 2014-04-21T14:45:28.960 回答