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

时间:2011-03-09 16:35:35

标签: python file dictionary pickle

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

6 个答案:

答案 0 :(得分:14)

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

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

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

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

答案 1 :(得分:2)

SQLite的

将数据存储在Sqlite数据库中可能是值得的。虽然在重构程序以使用Sqlite时会有一些开发开销,但查询数据库也变得更加容易和高效。

您还可以免费获得事务,原子性,序列化,压缩等。

根据您使用的Python版本,您可能已经内置了sqlite。

答案 2 :(得分:1)

您可以测试压缩字典(有一些限制请参阅:this post)如果磁盘访问是瓶颈,它将会很有效。

答案 3 :(得分:1)

我知道这是一个老问题,但对于那些仍在寻找这个问题答案的人来说,这是一个更新: protocol参数已在python 3中更新,现在有更快更有效的选项(即protocol=3protocol=4),这些选项在python 2下可能无效。 您可以在reference中阅读更多内容。

为了始终使用您正在使用的python版本支持的最佳协议,您只需使用pickle.HIGHEST_PROTOCOL即可。以下示例取自reference

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)

答案 4 :(得分:0)

这是很多数据...... 你的词典里面有什么内容?如果它只是原始数据类型或固定数据类型,那么真正的数据库或自定义文件格式是更好的选择吗?

答案 5 :(得分:0)

我在许多项目中都进行了尝试,得出的结论是shelve在保存数据方面比pickle快。两者在加载数据时执行相同的操作。 Shelve实际上是一个肮脏的解决方案。 那是因为您必须非常小心。如果您没有在打开shelve文件后关闭它,或者由于某种原因在打开和关闭它的过程中代码发生中断,则shelve文件很有可能会出现损坏(导致令人沮丧的KeyError);鉴于我们正在使用它们的人对它们感兴趣,因为存储了我们的大型dict文件,显然这也花费了很长时间,因此这确实很烦人 这就是为什么搁置是一个肮脏的解决方案的原因...尽管它仍然更快。好吧!