首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python在删除已加载的pickle变量后未释放内存

Python在删除已加载的pickle变量后未释放内存
EN

Stack Overflow用户
提问于 2021-07-29 14:32:10
回答 1查看 73关注 0票数 3

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

代码语言:javascript
复制
with open("/home/public/clusters.pkl", 'rb') as pickle_file:
    pickle_data = pickle.load(pickle_file)
del pickle_data

我尝试使用del、gc.collect、pickle_data = None和and方法,但都没有用。该文件包含一个很大的列表,加载到内存后会增加约50 to。只有在会话完成后才会释放内存。我在python web服务器中使用它,所以我不能在每次运行后重新启动web服务器。

代码语言:javascript
复制
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

我也尝试了使用多进程,只是我需要将它复制到另一个对象中,当我试图使用它隐藏的dict从进程中返回另一个对象时……

你知道我该怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2021-07-29 14:53:47

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

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
foo
bar

Try it online!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68577852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档