我如何先读取二进制pickle数据,然后解包?

4 投票
2 回答
25934 浏览
提问于 2025-04-15 22:20

我正在处理一个大约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

有没有什么想法?

2 个回答

1

文档中提到了 StringIO,我觉得这可能是一个解决方案。

你可以试试:

f = open("big_networkx_graph.pickle","rb")
bin_data = f.read()
sio = StringIO(bin_data)
graph_data = pickle.load(sio)
8

pickle.load(file) 这个函数需要一个像文件一样的对象。不过,你可以用下面这个:

pickle.loads(string)

这个函数可以从一个字符串中读取一个被“腌制”的对象层次结构。字符串中在被“腌制”的对象表示之后的字符会被忽略。

撰写回答