繁体   English   中英

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

[英]Why Python `Memory Error` with list `append()` lots of RAM left

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

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

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

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

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

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

编辑因为您询问的是Windows,以下页面是相关的: Windows版本的内存限制 如您所见,每个32位进程的限制为2,3或4GB,具体取决于操作系统版本和配置。

如果您愿意重新构建代码而不是向其投入更多内存,那么您可以使用以下代码:

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

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

我在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交换。

在评估包含大型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!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM