Python在删除加载的pickle变量后不释放内存



我正面临一个问题,内存没有得到释放后,删除了一个分配给加载pickle的变量。例如:

with open("/home/public/clusters.pkl", 'rb') as pickle_file:
pickle_data = pickle.load(pickle_file)
del pickle_data

我尝试使用del, gc。收集,pickle_data = None和添加方法,但没有任何帮助。文件包含一个巨大的列表,加载到内存后,它增加了~50GB。只有在会话结束后才释放内存。我在python web服务器中使用它,所以我不能在每次运行后重新启动web服务器。

proc = psutil.Process(os.getpid())
collect()
mem0 = proc.memory_info().rss
print(mem0)
with open("/home/public/deep1b/clusters_500k/clusters/clusters.pkl", 'rb') as pickle_file:
pickle_data = pickle.load(pickle_file)
mem1 = proc.memory_info().rss
print(mem1)
del pickle_data, pickle_file
mem2 = proc.memory_info().rss
print(mem2)
32194560
48298516480
48072097792

我也尝试使用多处理,只是事情是,我需要把这个复制到另一个对象,当我试图使用字典从进程返回这个其他对象时,它卡住了…

你知道我该怎么解决吗?

也许可以单独转储/加载列表项,这样您就不会一次将它们全部加载到内存中?

import pickle
# Demo data
data = ['foo', 'bar']
# Store
with open('pickle.dat', 'wb') as f:
pickle.dump(len(data), f)
for item in data:
pickle.dump(item, f)
# Load and process
with open('pickle.dat', 'rb') as f:
n = pickle.load(f)
for _ in range(n):
print(pickle.load(f))

输出:

foo
bar

上网试试!

最新更新