为什么dill.dump的字典(81000000个字节)的列表的需要永远?

问题描述 投票:0回答:1

我公司生产的810万个字节字典的列表,与9000000个+元素。每个元件具有32对值和密钥的字典,虽然相同的密钥的集合中的每个元素被使用。

我想将它保存供日后分析。我曾尝试dill.dump,但它永远把(1小时以上),我不得不中断内核。这是假设是快速和容易的,对不对?

这是我曾尝试:

import dill
output_file=open('result_list', 'wb')
dill.dump(result_list, output_file)
output_file.close()

我也尝试过咸菜和bzip2

import bz2
import pickle
output_file=bz2.BZ2File('result_list', 'w')
pickle.dump(result_list, output_file)

但遇到了内存不足的错误。

进行此可行且耗时更少任何提示?谢谢!

python dictionary dump large-files dill
1个回答
3
投票

我是dill作者。你可能想尝试klepto这种情况。 dill(实际上任何串行)将把整个dict作为单个对象...那大小的东西,你可能要正确对待更像条目的数据库......这是什么klepto可以做。最快的方法可能是使用将每个条目在磁盘上的单个目录不同的文件存档:

>>> import klepto
>>> x = range(10000)
>>> d = dict(zip(x,x))
>>> a = klepto.archives.dir_archive('foo', d)
>>> a.dump()

上述使得与10000子目录的目录,在它每一个条目。键和值都存储。注意:您可以调整序列化方法一点为好,所以检查的文档,看看该怎么做您的自定义情况。

或者,你可以遍历字典,和序列化每个转储条目从multiprocess.Pool平行的地图内。

(侧面说明,我multiprocessklepto的作者也一样)。

更新:因为这个问题是从序列化一个巨大的字典,序列化一个巨大的小类型的字典列表改变......这改变了答案。

klepto是专为大型dict状结构,所以它可能不是你想要的呢。你可能想尝试dask,这是为大array状结构建造。

我想你也可以遍历列表,每个序列化单独的列表中的条目......只要你以相同的顺序加载它们,你可以重建你的结果。你可以做类似的存储与值的位置,这样就可以,如果他们拿出的顺序排序恢复列表,然后。

我还问你,如果你有你的结果可能会被重组,是一种更好的方式去思考......

© www.soinside.com 2019 - 2024. All rights reserved.