Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python保存和加载大型词典的最快方法_Python_File_Dictionary_Pickle - Fatal编程技术网

用Python保存和加载大型词典的最快方法

用Python保存和加载大型词典的最快方法,python,file,dictionary,pickle,Python,File,Dictionary,Pickle,我有一本比较大的字典。我怎么知道尺寸?当我使用cPickle保存它时,文件大小将增加约400MbcPickle应该比pickle快得多,但是加载和保存这个文件只需要花费很多时间。我有一台2.6GHz双核笔记本电脑,在Linux机器上有4GB内存。有人对python中更快地保存和加载词典有什么建议吗?谢谢这是大量的数据。。。 你的字典有什么内容?如果它只是基本数据类型或固定数据类型,那么实际数据库或自定义文件格式可能是更好的选择?使用cPickle。默认协议(0)的速度要慢得多,并且在磁盘上生成的

我有一本比较大的字典。我怎么知道尺寸?当我使用
cPickle
保存它时,文件大小将增加约400Mb
cPickle
应该比
pickle
快得多,但是加载和保存这个文件只需要花费很多时间。我有一台2.6GHz双核笔记本电脑,在Linux机器上有4GB内存。有人对python中更快地保存和加载词典有什么建议吗?谢谢

这是大量的数据。。。 你的字典有什么内容?如果它只是基本数据类型或固定数据类型,那么实际数据库或自定义文件格式可能是更好的选择?

使用cPickle。默认协议(0)的速度要慢得多,并且在磁盘上生成的文件要大得多

如果您只想使用比内存容量更大的字典,那么该模块是一个很好的快速而肮脏的解决方案。它的作用类似于内存中的dict,但将自身存储在磁盘上而不是内存中。搁置是基于cPickle的,因此请确保将协议设置为0以外的任何值

与cPickle类似的数据库的优点将取决于您的用例。您多久编写一次数据?您希望读取您编写的每个数据多少次?您是否希望对您编写的数据执行搜索,或一次加载一个数据块

如果你只写一次,读很多,一次只加载一个文件,一定要使用数据库。如果您正在执行写一次、读一次,那么cPickle(使用除默认协议=0之外的任何协议)将很难被击败。如果您只是想要一个大的、持久的dict,请使用shelve。

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

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


取决于您使用的Python版本,您可能已经内置了sqlite。

您可以测试压缩您的字典(有一些限制,请参见:)如果磁盘访问是瓶颈,这将是有效的。

我知道这是一个老问题,但对于仍在寻找此问题答案的人来说,这只是一个更新: Python3中的
protocol
参数已经更新,现在有了更快、更高效的选项(即
protocol=3
protocol=4
),在Python2下可能无法工作。 你可以在杂志上读到更多

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


我在许多项目中都尝试过这种方法,并得出结论认为
shelve
在保存数据方面比
pickle
快。两者在加载数据时执行相同的操作。
Shelve
实际上是一个肮脏的解决方案。 那是因为你必须非常小心。如果在打开后不关闭<代码>搁置< /代码>文件,或者由于任何原因,在打开和关闭它时,代码中会发生一些中断,<>代码>搁置文件有很高的机会被破坏(导致令人沮丧的键值错误);这真的很烦人,因为我们使用它们的人对它们很感兴趣,因为我们存储了大量的dict文件,显然构建这些文件也花了很长时间
这就是为什么搁置是一个肮脏的解决方案。。。不过速度还是更快。所以

你字典中的键和值是什么?Aribitrary Python数据类型?是否可以改用sqlite,这样就不必在内存中加载整个内容?将cPickle的protocol参数设置为2@Sven:键是元组,成员数从2到5不等。而成员是utf-8I中编码的字符串,我也有同样的问题。我的字典大于16GB。为什么搁置是一个“肮脏”的解决方案?
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)