了解python numpy数组的内存分配

时间:2018-07-16 03:23:47

标签: python-3.x numpy memory-leaks

我想把头放在python numpy数组中的内存分配行为上。问题如下:

当使用的内存较小的阵列替换较大的阵列大小时会发生什么?示例如下:

[1] arr = np.rand.randint(1, 10, size=(2000, 3000)
...
[100] arr = np.ran.randint(1, 10, size=(20, 30)

[100]行,arr对象的大小将相应减小。所以我想知道两件事:

  1. 大于(20, 30)新大小的区域是否仍将作为垃圾存储在pc内存中?
  2. 如果上述情况属实,我是否需要在第del arr行之前显式使用[100]

脚注:我的问题的主要原因是我正在编写一个主要基于numpy的大型python程序。这是我第一次编写用于大型数据集的程序(正常大小为5万行7列)。

我发现,每次重新运行该程序时,内存都会不断增加,而不是我希望它恢复到原来的水平,因为我正在替换所有变量(即使我明确编写了{{1}之后,内存也会不断增加},并为我的变量写一些gc.collect()

我现在的怀疑可能是当用较小的数组替换时,较大的数组,内存仍在ram内部,只是没有被映射(上面我的问题)。

如果我对我在此内存泄漏问题上可以采取的措施有任何评论,也将有所帮助。 Tq

1 个答案:

答案 0 :(得分:0)

在[100]处的赋值创建一个新的数组对象,并将其分配给变量arr。如果没有其他对最初分配给arr的对象的引用(在[1]处),则该对象将可用于垃圾回收。暂时,大数组和小数组将同时存在于内存中。

[1]使用的空间可以在Python / numpy会话中重用,或者可以释放到操作系统。

别忘了numpy对象由一个形状小的dtype信息和一个data buffer的大块组成。 views可以共享数据缓冲区。这使确定是否要回收内存的任务变得复杂。

通常使用numpy和一般的Python,我们不会del一个对象。我们不会试图很好地控制内存。

我不确定rerun the program是什么意思。您是说在给定的Python会话中进行某种循环,还是从Shell重新调用该脚本?