Как мне сначала прочитать двоичные данные, а затем распаковать их? - PullRequest
2 голосов
/ 04 мая 2010

Я извлекаю объект NetworkX размером около 1 ГБ на диске. Несмотря на то, что я сохранил его в двоичном формате (используя протокол 2), процесс извлечения этого файла занимает очень много времени - по крайней мере, полчаса. Система, на которой я работаю, имеет достаточно системной памяти (128 ГБ), так что это не является узким местом.

Я прочитал здесь , что процесс ускорения можно ускорить, сначала прочитав весь файл в память, а затем распаковав его (этот конкретный поток ссылается на 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 ]

5 голосов
/ 04 мая 2010

pickle.load(file) ожидает файловый объект. Вместо этого используйте:

pickle.loads(string)

Считать иерархию засоленных объектов из строки. Символы в строке после представления засоленного объекта игнорируются.

1 голос
/ 04 мая 2010

В документации упоминается StringIO , что, я думаю, является одним из возможных решений.

Попытка:

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