【问题标题】:Why memory isn't liberate when the function is finished?为什么函数完成后内存没有释放?
【发布时间】:2016-07-19 04:18:36
【问题描述】:

当我执行下面的程序时,内存增加得非常快,所以我认为名为“secundary_function”的函数中使用的内存没有被释放。如果我复制我附加到列表的元素,或者如果我不使用secundary_function,问题就会消失。我想了解为什么这里需要复制以及为什么secundary_function 对使用的内存有影响..

import numpy as np
import time

def main_function(N):
    liste_images = []

    for i in range(N) :
        images = np.zeros((3000,25,25))
        time.sleep(0.05)
        secundary_function(images)
        liste_images.append(images[0])

def secundary_function(images):
    conservee = np.arange(len(images))
    images[conservee]

main_function(6000)

谢谢你的回答,对不起我的英语!

【问题讨论】:

  • 看起来您正在生成一个 3000x25x25 的 3D 数组 6000 次。这是你的意图吗?
  • 另请参阅此链接以释放内存:stackoverflow.com/questions/18310668/…
  • 在原始程序中,图像每次都是不同的 3D 阵列,并且有一个测试选择我想保留在 liste_images 列表中的一些 25x25 2D 阵列。但在我看来,每次创建新的 3D 数组“图像”时,都应该释放内存。
  • 您的代码有一些问题。您需要懂法语才能知道main_functionfonction_principale 相同。 secondary_function 的最后一行毫无意义。您正在用另一个数组索引一个数组?
  • 在 Python 中,变量实际上是指向对象的标签。只有在不再引用对象时,才能从内存中删除对象。也许您的原始程序保留了一些参考?

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


【解决方案1】:

在这一行:

liste_images.append(images[0])

images[0] 创建一个 3000x25x25 images 数组的视图。这意味着您附加到liste_imagesimages[0] 的结果具有对整个3000x25x25 数组的引用。这个大数组不会被垃圾收集。进行复制时,您会创建一个新的 25x25 数组,并且可以在 for 循环的下一次迭代中释放大数组。

【讨论】:

  • 但是我不明白为什么,如果我不使用secundary_function这个功能,问题就消失了……
  • @morningsun 好的,谢谢。我想我明白了:当我将images[conservee] 替换为images*2 时,问题是一样的。如果它不在 RAM 中,我只是不明白当我不使用它时阵列的存储位置。在硬盘上?不会很慢吧?
  • @Yohan.P - 最初只存储数组的大小和一些其他元数据。操作系统会跟踪实际使用数组的时间,然后才分配在内存中使用的数组(部分)。
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多