2010-05-04 2 views
1

디스크의 약 1GB 크기 인 NetworkX 객체를 언 피클 링하고 있습니다. 프로토콜 2를 사용하여 이진 형식으로 저장했지만이 파일을 unpickleing하는 데 아주 오랜 시간이 걸렸습니다. 적어도 30 분이 소요되었습니다. 실행중인 시스템에는 많은 시스템 메모리 (128GB)가있어 병목 현상이 아닙니다.어떻게 먼저 바이너리 피클 데이터를 읽은 다음,이를 언 피클 링합니까?

필자는 메모리에 전체 파일을 먼저 읽음으로써 pickling이 빨라질 수 있다고 읽었습니다. 그리고 그 파일을 unpickle 처리합니다. (특정 스레드는 사용하지 않는 python 3.0을 참조하지만 포인트는 여전히 있어야합니다. 파이썬 2.6에서 사실).

먼저 이진 파일을 읽고 unpickle하려면 어떻게합니까? 나는 시도했다 :

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)

문자열에서 절인 객체 계층 구조를 참조하십시오. 피클 링 된 객체의 표현을 지나친 문자열의 문자는 무시됩니다.

+0

. 나는 "로드"가 "로드 문자열"을 의미하기 때문에이 작업을 생각하지 않았습니다. 반면에로드중인 데이터는 바이너리입니다. 하지만 바이너리로 파일을 읽었 기 때문에 내가 먹는 문자열은 바이너리이기도합니다. 그래서 모두 작동합니다. 감사. – conradlee

+0

@conradlee : 파이썬 문자열은 바이너리 데이터를 지원하므로 그 구별을 할 필요가 없습니다. – unwind

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

관련 문제