在Python中保存和加载大型字典的最快方法

Hos*_*ein 13 python dictionary file pickle

我有一本相对较大的字典.我怎么知道尺寸?好吧,当我使用cPickle文件的大小保存它将增长约.400MB.cPickle 应该比pickle加载和保存这个文件快得多,只需要花费很多时间.我在Linux机器上有一台带有4GB RAM的双核笔记本电脑2.6 Ghz.有没有人有任何建议在python中更快地保存和加载字典?谢谢

And*_*rew 15

使用cPickle 的 protocol = 2选项.默认协议(0)要慢得多,并在磁盘上生成更大的文件.

如果你只想使用比内存更大的字典,搁置模块是一个很好的快速和肮脏的解决方案.它就像一个内存中的字典,但是它存储在磁盘而不是内存中.shelve基于cPickle,因此请务必将协议设置为0以外的任何其他协议.

sqlite这样的数据库优于cPickle 的优势将取决于你的用例.你多久写一次数据?您希望读取您编写的每个数据多少次?您是否想要搜索您编写的数据,或者一次加载一个?

如果您正在进行一次写入,多次读取,并且一次加载一个,则一定要使用数据库.如果你正在写一次,读一次,cPickle(使用除默认协议以外的任何协议= 0)将很难被击败.如果你只想要一个大而持久的字典,请使用搁置.

  • 我也有同样的问题。我的字典大于16GB。为什么搁置“肮脏”的解决方案? (2认同)

Mor*_*hof 8

我知道这是一个老问题,但对于那些仍在寻找这个问题的答案的人来说,这是一个更新:protocol参数已在 python 3 中更新,现在有更快、更有效的选项(即protocol=3protocol=4),它们可能无法在python 2. 您可以在参考资料中阅读更多相关信息

为了始终使用您正在使用的 python 版本支持的最佳协议,您可以简单地使用pickle.HIGHEST_PROTOCOL. 以下示例取自参考资料

import pickle
# ...
with open('data.pickle', 'wb') as f:
    # Pickle the 'data' dictionary using the highest protocol available.
    pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
Run Code Online (Sandbox Code Playgroud)