【问题标题】:Python27 Memory Error IssuesPython27 内存错误问题
【发布时间】:2014-04-21 14:06:23
【问题描述】:

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

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

【问题讨论】:

  • 能否在短程序中重现此错误?如果是这样,你应该把它贴在这里。
  • 我不太确定。我正在使用的代码非常冗长。我最初没有写它,我只是想用它来处理数据,所以很多 opencl 的东西都在我头上。如果它很重要,程序总是在 s = zeros((A,B,C),complex128) 中大约 30-40 次迭代的同一行失败
  • 我不明白,因为 ti 似乎创建零矩阵不应该很费力?
  • 对于 A =2400, B=256, C=25*****

标签: python-2.7 memory pyopencl pythonxy


【解决方案1】:

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

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) 花费大量时间来追踪为什么在运行垃圾收集语言一段时间后无法分配大的连续块。

【讨论】:

  • 哇,感谢您的详细回答。一些内存管理的东西让我有点不知所措,但我得到了你评论的一般笑话:D。所以,我每次通过循环调用的函数都是为每个实例定义's='。我想我在这里会没事的,因为我在这个函数的末尾使用了'del s'。我将在仅分配一次 s 时重试此脚本。谢谢!
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
相关资源
最近更新 更多