【问题标题】:Understand memory allocation for python numpy array了解python numpy数组的内存分配
【发布时间】:2018-07-16 03:23:46
【问题描述】:

我想了解一下 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. 如果上述情况属实,我是否需要在[100] 行之前显式使用del arr

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

我发现每次我重新运行程序时,内存都会不断增加,而不是我期望它会再次恢复到原来的值,因为我正在替换所有变量(即使我明确写入 gc.collect() 后,内存也会不断增加很多行,还为我的变量写了一些del)。

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

如果您对我能解决这个内存泄漏问题有什么意见,那也会很有帮助。时长

【问题讨论】:

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


    【解决方案1】:

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

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

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

    通常使用numpy 和Python,我们不使用del 对象。我们不会试图那么精细地控制内存。

    我不太清楚你所说的rerun the program 是什么意思。您是指给定 Python 会话中的某种循环,还是从 shell 对脚本的新调用?

    【讨论】:

    • rerun the program 是对脚本的新调用
    • 如何检查内存使用情况?任务监视器报告每个正在运行的脚本的内存使用情况。一个脚本调用的内存使用不应影响另一个脚本调用的使用,无论它是同时运行还是顺序运行。
    猜你喜欢
    • 2017-03-13
    • 2011-03-23
    • 1970-01-01
    • 2021-07-17
    • 2018-01-23
    • 2019-07-08
    • 1970-01-01
    • 2013-03-04
    • 2021-12-13
    相关资源
    最近更新 更多