解卡后系统占用大量内存

2024-09-28 03:16:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个结构为的对象(defaultdict): {srting:[(字符串,(float,float)),(string,(float,float)),…]}

它的大小大约是12.5 MB

我正在用代码进行酸洗:

with open(Path_to_file, 'wb') as file:
    pickle.dump(data_dict, file)

Pickle文件重约300 MB。 正在取消与代码的匹配:

^{pr2}$

系统使用大量RAM(大约3.5GB或更多)。但是在取消pickle之后,Python使用了大约1gb的RAM。在

所以我有两个问题:

  1. 在我的结构中,有什么保持在RAM中?在
  2. 我怎样才能清洁它?在

在gc.收集()没用。在


Tags: path对象字符串代码stringwithmbopen
1条回答
网友
1楼 · 发布于 2024-09-28 03:16:06

我能复制这个。事实上,如果你正在解包一个大的(大约300米)文件,会占用大量额外的内存。在我的例子中,进程使用1.6G只是为了保留原始生成的data_dict,如果我从文件加载它,则使用2.9G。在

然而,若在子进程中运行unpickling,系统将在进程join()之后进行一次完整的内存清理。(如回答所述:https://stackoverflow.com/a/1316799/1102535)。因此,在没有额外内存的情况下取消拾取的示例如下:

from multiprocessing import Process, Manager

def load_pickle(filename, data):
    import cPickle as pickle
    with open(filename, 'rb') as file:
        data_pkl = pickle.load(file)
    for key, val in data_pkl.iteritems():
        data[key] = val

manager = Manager()
data_dict = manager.dict()
p = Process(target=load_pickle, args=("test.pkl", data_dict))
p.start()
p.join()
print len(data_dict)

这段代码有它的缺点(比如在dict之间复制),但至少你有这个想法。对我来说,它在取消拾取后使用的内存量几乎与酸洗前的原始数据相同。在

相关问题 更多 >

    热门问题