【问题标题】:Numpy Memory Error on Linux Server but not MacLinux 服务器上的 Numpy 内存错误,但不是 Mac
【发布时间】:2015-12-19 19:52:33
【问题描述】:

我知道有很多 numpy 内存错误主题,所以我希望我没有重复任何内容。我正在尝试使用np.zeros((500000,10000)) 创建一个 np 数组。这在我的内存为 16G 的 Mac 上运行良好,但在内存为 28G 的 Linux 服务器上,它会立即以Memory Error 失败。我已经验证我正在运行 64 位版本的 Ubuntu 和 Python,并且我使用的是 Numpy 1.9.3。我注意到系统之间的唯一区别(除了明显的区别)是在运行 ulimit -a 时,我得到:

Linux:max locked memory (kbytes, -l) 64

Mac:max locked memory (kbytes, -l) unlimited

这可能是我无法运行此命令的原因吗?如果没有,我是否缺少其他一些配置选项?

【问题讨论】:

  • 服务器是你的还是你刚刚使用的主机由别人管理?
  • 它在 AWS 但我有 sudo 访问权限
  • 好吧,你会想读像this这样的东西。您似乎已被管理员锁定。我不知道您是否可以自己影响这一点,或者需要向贝佐斯寻求帮助,但您走在正确的轨道上。祝你好运。
  • @ShawnMehan 这是几个月后的事,但当我尝试这样做时,结果发现我没有虚拟内存。我不得不哄骗我的系统管理员给我 20GB,但在那之后它就起作用了 :)
  • OS X Mavericks 和更高版本也有一些新的内存管理。根据我的经验,我发现它允许我分配大量内存,否则会导致malloc 失败。不确定这是否相关。

标签: python linux macos numpy


【解决方案1】:

我的最佳猜测是:

  1. Mac 有一个交换,允许分配的内存比您看到的 RAM 更多。
  2. Mac 直到实际使用内存时才意识到该数组不适合内存。所以数组实际上不适合内存,但在你使用该内存之前你不会知道它。

我的第一个猜测是,在 64 位中,您的阵列将占用 500000*10000*8= 40GB 的 RAM 20GB 在 32 位中,因此阵列不适合您拥有的内存。可能有一个交换来解决丢失的内存。

我的第二个猜测基于this link,其中解释说 np.zeros 不会在内存中实际分配零,直到第一次访问该内存。我已经在我的 linux (Ubuntu) 计算机上测试了 np.zeros 可以处理不断增加的数组,直到达到我的 RAM 限制。然后我得到一个内存错误,即使它实际上并没有分配内存。

一旦你创建了矩阵(增加足够的大小以清除内存使用):

a = np.zeros((50,10))

您可以通过在矩阵的每个单元格中存储一个零来检查所需的实际内存:

a[:,:] = 0.0

或强制执行操作,以便访问并分配内存:

a = a + a

在执行此检查以了解何时分配内存时跟踪计算机的内存使用情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    相关资源
    最近更新 更多