在Python中保存和加载大字典的最快方法
我有一个比较大的字典。怎么知道它的大小呢?当我用 cPickle
保存它的时候,文件的大小大约会变成400MB。cPickle
理论上比 pickle
快很多,但加载和保存这个文件真的花了很多时间。我用的是一台2.6 GHz的双核笔记本电脑,内存有4GB,运行的是Linux系统。有没有人能给我一些建议,让我在Python中更快地保存和加载字典呢?谢谢!
6 个回答
Sqlite
把数据存储在Sqlite数据库里是个不错的主意。虽然在调整你的程序以适应Sqlite时可能会有一些额外的工作,但查询数据库会变得更简单、更高效。
而且,你还可以免费享受到事务处理、原子性、序列化、压缩等功能。
根据你使用的Python版本,你可能已经自带了sqlite。
我知道这个问题已经很老了,但我想给那些还在寻找答案的人更新一下信息:在Python 3中,protocol
参数已经更新,现在有更快、更高效的选项(比如protocol=3
和protocol=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)
使用cPickle的protocol=2选项。默认的协议(0)速度很慢,而且生成的文件在磁盘上也会很大。
如果你只是想处理一个比内存能容纳的更大的字典,shelve模块是个简单快捷的解决方案。它的工作方式像一个内存中的字典,但它把数据存储在磁盘上,而不是内存里。shelve是基于cPickle的,所以一定要把协议设置为0以外的其他值。
像sqlite这样的数据库相比于cPickle的优点,取决于你具体的使用场景。你多久会写一次数据?你预计每条写入的数据会被读取多少次?你是否想对写入的数据进行搜索,或者一次加载一条数据?
如果你是写一次,读很多,并且一次加载一条数据,那就用数据库吧。如果你是写一次,读一次,使用cPickle(只要协议不是默认的protocol=0)会更合适。如果你只是想要一个大的、持久的字典,使用shelve就可以了。