Linux服务器上的Numpy内存错误,但不是Mac

jpa*_*avs 16 python linux macos numpy

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

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

苹果电脑: max locked memory (kbytes, -l) unlimited

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

Man*_*txu 4

我最好的猜测是:

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

我的第一个猜测是,在 64 位中,您的数组将占用 500000*10000*8= 40GB RAM,在 32 位中则需要 20GB,因此该数组不适合您拥有的内存。可能会进行交换来弥补丢失的内存。

我的第二个猜测基于此链接,其中解释了 np.zeros 在第一次访问内存之前不会在内存中实际分配零。我在我的 Linux (Ubuntu) 计算机上进行了测试,np.zeros 可以处理不断增加的数组,直到达到 RAM 限制。然后,即使它实际上没有分配内存,我也会收到内存错误。

创建矩阵后(增加足够的大小以明确内存使用情况):

a = np.zeros((50,10))
Run Code Online (Sandbox Code Playgroud)

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

a[:,:] = 0.0
Run Code Online (Sandbox Code Playgroud)

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

a = a + a
Run Code Online (Sandbox Code Playgroud)

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