2010-05-04 80 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