문제

피클 모듈은 산세 할 때 문자열 탈출 문자를 사용하는 것 같습니다. 이것은 비효율적 인 예를 들어 비효율적입니다. 다음을 고려하세요

z = numpy.zeros(1000, numpy.uint8)
len(z.dumps())
len(cPickle.dumps(z.dumps()))

길이는 각각 1133 자와 4249 자입니다.

z.dumps ()는 " x00 x00"(실제 0 인 String)과 같은 것을 드러내지 만 Pickle은 String의 repl () 함수를 사용하여 " ' x00 x00'"(0 인 ASCII Zeros)를 산출하는 것으로 보입니다.

ie (z.dumps () == false)의 "0"및 (cpickle.dumps (z.dumps ()) == true의 "0"

도움이 되었습니까?

해결책

프로토콜 매개 변수와 함께 후기 버전의 피클 프로토콜을 사용해보십시오. pickle.dumps(). 기본값은 0이고 ASCII 텍스트 형식입니다. 1보다 큰 것 (Pickle.highest_protocol을 사용하는 것이 좋습니다). 프로토콜 형식 1과 2 (및 3이지만 PY3K의 경우)는 이진이며 더 많은 공간 보수적이어야합니다.

다른 팁

해결책:

import zlib, cPickle

def zdumps(obj):
  return zlib.compress(cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL),9)

def zloads(zstr):
  return cPickle.loads(zlib.decompress(zstr))  

>>> len(zdumps(z))
128

z.dumps() 이미 절인 문자열, 즉 Pickle.loads ()를 사용하여 꼬할 수 있습니다.

>>> z = numpy.zeros(1000, numpy.uint8)
>>> s = z.dumps()
>>> a = pickle.loads(s)
>>> all(a == z)
True

Vartec의 답변에 대한 개선은 조금 더 메모리 효율적으로 보입니다 (모든 것이 문자열로 강제되지 않기 때문에) :

def pickle(fname, obj):
    import cPickle, gzip
    cPickle.dump(obj=obj, file=gzip.open(fname, "wb", compresslevel=3), protocol=2)

def unpickle(fname):
    import cPickle, gzip
    return cPickle.load(gzip.open(fname, "rb"))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top