在python中将元素从文本文件添加到字典时,内存泄漏



我正在运行一个非常简单的代码来读取txt文件并将它们添加到现有的字典中。使用htop,我看到使用的内存线性增加,直到内存耗尽。下面是代码的简化版本:

import numpy as np
data = np.load(path_dictionary, allow_pickle=True)
dic = data.item()
for ids in dic:
output = np.loadtxt(filename)
array = output[:,1]
dic[ids][new_info] = array

我试图删除输出并在循环中添加垃圾收集器,但它没有帮助。

del output
del array
gc.collect()

我使用了这篇文章中的一个函数来获得100次迭代之前和之后的字典大小。原来的字典是9GB,大小增加了大约13MB,而从顶部使用的内存增加了10GB。脚本应该读取大约70K的文件。

有人可以帮助我是什么导致内存泄漏,并为它可能的解决方案?

当您调用array = output[:,1]时,numpy只是创建一个视图。这意味着它保留了对整个(可能很大的)output的引用,并且array只是第一列的信息。现在您将此引用保存到dic,这意味着仍然存在对整个输出的引用,并且垃圾收集器无法释放内存。

要解决这个问题,只需指示numpy创建一个副本:

array = output[:,1].copy()

这样数组将包含它自己的数据副本(这比创建视图要慢),但关键是一旦删除output(通过del output显式地或在下一次迭代中覆盖它),就不会再引用输出并且内存将被释放。

Python的垃圾收集器会自动清理未使用的变量,但是一些大型容器(例如:列表,字典)总是不能按预期收集。代码中的变量array会导致内存泄漏,因为它创建了一个每个循环对output进行新的引用,并且它被dic引用。因此,您应该在深度复制(而不是浅复制)之后的每个循环中删除array,并使dic引用复制的一个。

from copy import deepcopy
for ids in dic:
output = np.loadtxt(filename)
array = output[:,1]
array_c = deepcopy(array) 
del array
dic[ids][new_info] = array_c

相关内容

  • 没有找到相关文章

最新更新