我有一个具有结构的对象(defaultdict):{ srting:(string,(浮,浮)),(字符串,(浮,浮)),.}
大小约为12,5MB。
我在用密码泡菜:
with open(Path_to_file, 'wb') as file:
pickle.dump(data_dict, file)酸洗文件的重量约300 MB。在处理过程中,使用代码进行无酸洗:
with open(Path_to_file, 'rb') as file:
data_dict_new = pickle.load(file)系统正在使用大量的RAM (大约3,5 GB及更多)。但是在解锁之后,Python使用了大约1GB的RAM。
所以我有两个问题:
gc.collect()没有帮助。
发布于 2016-02-12 13:49:30
我复制了这个。实际上,如果您正在解析一个大文件(约300米),则会占用大量额外的内存。在我的示例中,进程使用1.6G只是为了保持原始生成的data_dict,如果我从文件中加载它,则使用2.9G。
但是,如果您要在子进程中运行去酸洗,系统将在进程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)这段代码有它的缺点(比如在dicts之间进行复制),但至少您有这样的想法。至于我,它使用的内存数量几乎相同,在不加酸洗之前,对原始数据的酸洗。
https://stackoverflow.com/questions/35360715
复制相似问题