我正在从一组文本文件构建一个大型数据字典。当我阅读这些内容并处理它们时,我append(dataline)
到列表。
在某些时候,append()
会生成Memory Error
例外。但是,观看程序在Windows任务管理器中运行,在崩溃时我看到4.3 GB可用和1.1 GB免费。
因此,我不明白异常的原因。
Python版本是2.6.6。我想,唯一的原因是它无法使用更多可用的RAM。如果是这样,是否可以增加分配?
答案 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版本)。
现在我所有的Numpy,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。我建议你研究一下:)