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

2024-06-16 11:28:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我已经读过here那篇文章,通过先将整个文件读入内存,然后取消对它的pickling(那个特定的线程指的是python 3.0,我没有使用它,但这一点在python 2.6中应该仍然是正确的),可以加快pickling的速度。

如何先读取二进制文件,然后解除对其的锁定?我试过:

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

有什么想法吗?


Tags: 文件对象内存networkx协议readdatabin
2条回答

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

^{}

Read a pickled object hierarchy from a string. Characters in the string past the pickled object’s representation are ignored.

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

尝试:

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

相关问题 更多 >