为什么Python`Memory Error`带有列表`append()`剩下大量的RAM

时间:2010-12-14 17:07:44

标签: python list memory

我正在从一组文本文件构建一个大型数据字典。当我阅读这些内容并处理它们时,我append(dataline)到列表。

在某些时候,append()会生成Memory Error例外。但是,观看程序在Windows任务管理器中运行,在崩溃时我看到4.3 GB可用和1.1 GB免费。

因此,我不明白异常的原因。

Python版本是2.6.6。我想,唯一的原因是它无法使用更多可用的RAM。如果是这样,是否可以增加分配?

5 个答案:

答案 0 :(得分:27)

如果您使用的是32位版本的Python,则可能需要尝试使用64位版本。

进程有可能使用32位地址寻址最多4GB的RAM,但通常(取决于操作系统),一个可以少得多。听起来你的Python进程可能会达到这个限制。 64位寻址消除了这种限制。

修改由于您询问的是Windows,因此以下页面与您相关:Memory Limits for Windows Releases。如您所见,每个32位进程的限制为2,3或4GB,具体取决于操作系统版本和配置。

答案 1 :(得分:5)

如果您愿意重新构建代码而不是向其投入更多内存,那么您可以通过以下方式实现:

data = (processraw(raw) for raw in lines)

其中lines是行列表或file.xreadlines()或类似行。

答案 2 :(得分:4)

我在64位Windows环境中使用32位版本的python时遇到了类似的问题。我尝试了64位Windows版本的python,很快就遇到了为64位窗口编译的Scipy库的麻烦。

我实施的完全免费的解决方案是

1)安装VirtualBox
2)在VM上安装CentOS 5.6 3)获取Enthought Python Distribution(免费的64位Linux版本)。

现在我所有的Nu​​mpy,Scipy和Matplotlib依赖的python代码都可以使用尽可能多的内存,因为我有Ram和可用的Linux交换。

答案 3 :(得分:3)

在评估包含大numpy个数组的表达式时(实际上,一个是稀疏的),我遇到了类似的问题。我在一台64GB内存的机器上这样做,其中只有大约8GB的内存使用,所以很惊讶得到了MemoryError

事实证明,我的问题是阵列形状广播:我无意中重复了一个大尺寸。

它是这样的:

  • 我通过了一个形状为(286577, 1)的数组,我期待(286577)
  • 这是从形状为(286577, 130)的数组中减去的。
  • 因为我期待(286577),所以我在表达式中应用[:,newaxis]将其带到(286577,1),以便广播到(286577,130)
  • 当我通过形状(286577,1)时,[:,newaxis]生成了形状(286577,1,1),并且两个数组都被广播以形成(286577,286577,130) ...双打。有两个这样的数组,大约80GB!

答案 4 :(得分:0)

正如已经提到的,你需要一个python64位(64位版本的windows)。

请注意,您可能会遇到许多可能需要使用的基本软件包的冲突和问题。为了避免这个问题,我建议来自Continuum Analytics的Anaconda。我建议你研究一下:)