質問

pickleモジュールは、酸洗の文字列エスケープ文字を使用しているようです。これは非効率的となり、例えばnumpyのアレイ上。次のことを考えてみましょう。

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

の長さは、それぞれ1133の文字と4249個の文字である。

z.dumpsは() "\ X00 \ X00"(文字列の実際のゼロ)のようなものを明らかにしたが、漬物は、 " '\ X00 \ X00'"(ゼロというアスキーを得、文字列ののrepr()関数を使用しているように見えますゼロ)。

すなわち。 (z.dumpsで "0"()==偽)と(cPickle.dumpsで "0"(z.dumps())== TRUE)

役に立ちましたか?

解決

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