为什么Python'Memory Error`和list'append()`还有很多内存

为什么Python'Memory Error`和list'append()`还有很多内存,python,list,memory,Python,List,Memory,我正在从一组文本文件构建一个大型数据字典。当我读入这些行并处理它们时,我将(dataline)附加到一个列表中 在某个时刻,append()会生成一个内存错误异常。但是,在Windows任务管理器中运行该程序时,在崩溃点我看到4.3 GB可用,1.1 GB可用 因此,我不明白例外的原因 Python版本是2.6.6。我想,唯一的原因是它不能使用更多的可用RAM。如果是这样,是否可以增加分配?如果您使用的是32位的Python版本,您可能需要尝试64位版本 一个进程可以使用32位地址寻址最多4GB

我正在从一组文本文件构建一个大型数据字典。当我读入这些行并处理它们时,我
将(dataline)
附加到一个列表中

在某个时刻,
append()
会生成一个
内存错误
异常。但是,在Windows任务管理器中运行该程序时,在崩溃点我看到4.3 GB可用,1.1 GB可用

因此,我不明白例外的原因


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

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

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


编辑由于您询问的是有关Windows的信息,因此以下页面具有相关性:。正如您所看到的,每个32位进程的限制是2、3或4GB,具体取决于操作系统版本和配置。

如果您愿意重新构造代码,而不是向其投入更多内存,您可能可以这样做:

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

其中,
是行列表或
文件.xreadlines()
或类似内容。

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

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

1) 安装VirtualBox
2) 在虚拟机上安装CentOS 5.6
3) 获取Enthound Python发行版(免费64位Linux版本)


现在,我的所有依赖于Numpy、Scipy和Matplotlib的python代码都可以使用Ram和可用的Linux交换所占用的内存。

正如前面提到的,您需要一个python64位(64位版本的windows)


请注意,您可能会面临许多与您可能希望使用的一些基本软件包有关的冲突和问题。为了避免这个问题,我推荐Continuum Analytics。我建议您仔细研究一下:)

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

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

事情是这样的:

  • 我通过了一个形状为
    (286577,1)
    的数组,而我正期待着
    (286577)
  • 这是从一个具有形状
    (286577130)
    的数组中分割出来的
  • 因为我期望
    (286577)
    ,所以我在表达式中应用了
    [:,newaxis]
    ,将其带到
    (286577,1)
    ,以便将其广播到
    (286577130)
  • 然而,当我通过shape
    (286577,1)
    时,
    [:,newaxis]
    生成了shape
    (286577,1,1)
    ,两个数组都被广播到shape
    (286577286577130)
    。。。双打。有了两个这样的阵列,总容量约为80GB
尝试使用64位Python版本。如果您使用的是任何扩展模块,那么它们也需要构建64位。您可以打印
MemoryError
异常字符串吗?这应该会给我们提供更多信息。您是在处理行之前还是之后追加?@nmichaels-看起来是这样的:
data.append(processraw(raw))
。每个
raw
都是一行。向我们展示更多的代码,也许我们可以向您展示如何提高内存消耗。您的文本文件集有多大@aix大约是32位,而不是64位。是的,32位。有没有办法控制分配多少?或者看看分配了多少?我想核实一下我们是否达到了极限。顺便说一句,当进程崩溃时,它在任务管理器窗口中被列为使用1.9GB。@Pete您应该能够在任务管理器中看到这一点:(在“Mem Usage”(内存使用)下)。我的意思是,查看分配限制是什么或更改它,以验证内存是否不足,而不是假设当前分配为1.9GB,是limit@Pete看看我链接到的页面上的@Pete,你想要“每个32位进程的用户模式虚拟地址空间”