2011-03-22 3 views
-1

바보 같은 질문이 있습니다. 이미 다른 프로토콜 옵션을 사용하여 이미 cPickled 파일을 다시 pickle (cPickle) 할 수 있으며 매우 큰 파일에 가장 적합한 프로토콜입니다. 도움이나 제안을 부탁드립니다.c 프로토콜 사용 옵션 파일

답변

4

은 정말 당신이 파일을 산세 무슨 뜻인지 이해가 안 돼요. 피클 링 된 파일을 unpickle 처리하지 않고 바이너리로 읽은 다음 다시 피클 링 하시겠습니까? 이것은 문제가되어서는 안되지만 좋은 일은 없을 것입니다 ...

피클의 기본 프로토콜 버전은 0, ASCII (pickle docs)입니다. 최신 바이너리 프로토콜은 2로, 파일 크기가 작아집니다. 필자의 경우, 바이너리 픽 셀 출력은 아래의 ASCII 피클 코드와 같이 잼 jpg 그림의 절반에 불과했습니다.

피클 같은 인터페이스를 가지고 있지만 더 안전하다고 생각되는 cerealizer을 생각해보십시오. 그것은 자신의 바이너리 프로토콜을 가지고있는 것으로 보이는데, 파일 크기는 pickle 바이너리만큼 작습니다.

import cerealizer 
#import cPickle as cerealizer 

def save(data, filename): 
    f = open(filename,"wb") 
    cerealizer.dump(data, f, protocol=2) 
    f.close() 

def load(filename): 
    f = open(filename,"rb") 
    p = cerealizer.load(f) 
    f.close() 
    return(p) 

if __name__ == "__main__": 
    import PIL.Image 
    import cStringIO as StringIO 

    stringIO = StringIO.StringIO() 
    im = PIL.Image.open("picture.jpg") 
    im.save(stringIO, "JPEG") 

    stringIO.seek(0) 
    save(stringIO.read(), "testCerealizerIm.txt") 

    binaryImageData = load("testCerealizerIm.txt") 

    stringIO2 = StringIO.StringIO() 
    stringIO2.write(binaryImageData) 

    stringIO2.seek(0) 
    im = PIL.Image.open(stringIO2) 
    im.show()