2010-05-04 51 views
1

我正在取消在磁盘上大小约为1GB的NetworkX对象。虽然我以二进制格式保存它(使用协议2),但要解开这个文件需要很长时间---至少半小时。我正在运行的系统有很多系统内存(128 GB),所以这不是瓶颈。如何先读取二进制pickle数据,然后取下它?

我读过here酸洗可以通过首先读取整个文件到内存中,然后取消它(特定的线程是指python 3.0,我不使用,但点仍应该在python 2.6中为true)。

我该如何先读取二进制文件,然后取下它?我曾尝试:

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 

任何想法?

回答

4

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

pickle.loads(string)

从字符串阅读腌制对象层次。字符串中超过pickle对象表示的字符将被忽略。

+0

这似乎是工作。我不认为这是因为“加载”意味着“加载字符串”,而我加载的数据是二进制的。但是因为我用二进制读取文件,所以我输入的字符串也是二进制的,所以这一切都可以实现。谢谢。 – conradlee 2010-05-04 09:54:26

+0

@conradlee:Python字符串支持二进制数据,所以不需要做出区分。 – unwind 2010-05-04 11:59:45

1

该文件提到StringIO,我认为这是一种可能的解决方案。

尝试:

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

这是有效的,但它需要导入StringIO,它比gimel的解决方案更复杂 - 这就是为什么我要给他信用的答案。 – conradlee 2010-05-04 11:30:39