Python 如何先读取二进制pickle数据,然后将其取消pickle?

Python 如何先读取二进制pickle数据,然后将其取消pickle?,python,serialization,pickle,Python,Serialization,Pickle,我正在解压磁盘上大约1GB大小的NetworkX对象。虽然我以二进制格式保存了它(使用协议2),但要解开这个文件需要很长时间——至少半个小时。我运行的系统有大量的系统内存(128GB),所以这不是瓶颈 我已经读到,通过先将整个文件读入内存,然后将其解压,可以加快酸洗速度(该特定线程引用python 3.0,我没有使用它,但在python 2.6中这一点应该仍然是正确的) 如何先读取二进制文件,然后将其解压?我试过: import cPickle as pickle f = open("big_n

我正在解压磁盘上大约1GB大小的NetworkX对象。虽然我以二进制格式保存了它(使用协议2),但要解开这个文件需要很长时间——至少半个小时。我运行的系统有大量的系统内存(128GB),所以这不是瓶颈

我已经读到,通过先将整个文件读入内存,然后将其解压,可以加快酸洗速度(该特定线程引用python 3.0,我没有使用它,但在python 2.6中这一点应该仍然是正确的)

如何先读取二进制文件,然后将其解压?我试过:

import cPickle as pickle
f = open("big_networkx_graph.pickle","rb")
bin_data = f.read()
graph_data = pickle.load(bin_data)
但这也带来了:

TypeError: argument must have 'read' and 'readline' attributes
有什么想法吗?

pickle.load(file)需要一个类似文件的对象。相反,请使用:

从字符串中读取pickle对象层次结构。字符串中超过pickle对象表示形式的字符将被忽略


文档中提到了,我认为这是一个可能的解决方案

尝试:


这似乎奏效了。我不认为这是可行的,因为“加载”意味着“加载字符串”,而我加载的数据是二进制的。但是因为我是用二进制文件读取文件的,所以我提供给它的字符串也是用二进制文件的,所以一切都是正确的。谢谢。@conradlee:Python字符串支持二进制数据,所以没有必要进行区分。这是可行的,但因为它需要导入StringIO,所以比gimel的解决方案更复杂——这就是为什么我要相信他的答案。
f = open("big_networkx_graph.pickle","rb")
bin_data = f.read()
sio = StringIO(bin_data)
graph_data = pickle.load(sio)