2013-11-20 2 views
2

파이썬에서 데이터를로드 할 때 두 가지 문제가 있습니다. 두 가지 scipts가 제대로 작동하지만 너무 많은 시간이 필요하며 때로는 "Killed"가 첫 번째 결과와 함께 나타납니다. 파이썬에서의 빠른 파일로드

  1. 나는 큰 압축 된 텍스트 파일을 가지고 있고이 같은 것을 할 : 나는 이전의 스크립트에서 만든 사전에 몇 가지 작업을 할 필요가

    import gzip 
    import cPickle as pickle 
    
    f = gzip.open('filename.gz','r') 
    tab={} 
    
    for line in f: 
         #fill tab 
    
    with open("data_dict.pkl","wb") as g: 
         pickle.dump(tab,g) 
    
    f.close() 
    
  2. import cPickle as pickle 
    
    with open("data_dict.pkl", "rb") as f: 
         tab = pickle.load(f) 
    f.close() 
    
    #operations on tab (the dictionary) 
    

다른 해결책이 있습니까? 아마 YAML 또는 JSON이 관련된 것이 아닐 수도 있습니다 ...

+0

Pickle은 느리고 매우 불안정 할 수 있습니다. 하지만 가장 빠른 pickle 프로토콜 (docs 참조)을 사용하기위한 힌트를 적어도 추가해야합니다. pickle.HIGHEST_PROTOCOL은 덤프의 세 번째 매개 변수입니다. 당신이 실제로하는 일에 따라, 속도를 높이는 다른 많은 옵션들이 있습니다. (예 : sqlite db 사용). – schlenk

+1

스트리밍이 아닌 모든 것을 메모리에로드한다는 문제가 있습니까? 그렇다면 스트리밍 피클 (https://code.google.com/p/streaming-pickle/)을 확인해보십시오. – user2141650

답변

0

먼저 한 의견은 :

with open("data_dict.pkl", "rb") as f: 
     tab = pickle.load(f) 
f.close() 

f.close()이 필요하지 않습니다, 컨텍스트 관리자 (with 구문)이 자동으로 수행합니다.

이제 속도면에서 볼 때, 디스크에서 Python 개체로 직접 읽는 것을 목적으로 cPickle보다 너무 빨리 빠져 나갈 생각은 없습니다. 이 스크립트는 반복해서 실행해야하는 경우 나는 당신이 빠른 번개 액세스 할 수 있도록 메모리에 지속적으로 저장 개체를 유지하기 위해 pylibmc를 통해 memchached를 사용하려고 할 것입니다 :

import pylibmc 

mc = pylibmc.Client(["127.0.0.1"], binary=True,behaviors={"tcp_nodelay": True,"ketama": True}) 
d = range(10000)   ## some big object 
mc["some_key"] = d  ## save in memory 

그 다음을 저장 한 후 액세스 할 수있는 일단 수정 이전 프로그램이 실행을 마친 후에도 메모리에 남아 있습니다.

import pylibmc 
mc = pylibmc.Client(["127.0.0.1"], binary=True,behaviors={"tcp_nodelay": True,"ketama": True}) 
d = mc["some_key"]  ## load from memory 
d[0] = 'some other value' ## modify 
mc["some_key"] = d  ## save to memory again