9

pickleモジュールは、pickle化時に文字列エスケープ文字を使用しているようです。これは、たとえばnumpy配列では非効率になります。次のことを考慮してください

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

長さはそれぞれ1133文字と4249文字です。

z.dumps()は「\ x00 \ x00」(文字列の実際のゼロ)のようなものを明らかにしますが、pickleは文字列のrepr()関数を使用しているようで、「'\ x00 \ x00'」(ゼロはASCIIゼロ)を生成します。

つまり、(z.dumps()の「0」== False)および(cPickle.dumps(z.dumps())の「0」== True)

4

4 に答える 4

24

プロトコル パラメータを に指定して、新しいバージョンの pickle プロトコルを使用してみてくださいpickle.dumps()。デフォルトは 0 で、ASCII テキスト形式です。1 より大きいもの (pickle.HIGHEST_PROTOCOL を使用することをお勧めします)。プロトコル形式 1 と 2 (および 3 ですが、それは py3k 用です) はバイナリであり、よりスペースを節約する必要があります。

于 2009-03-30T02:40:30.510 に答える
9

解決:

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
于 2009-03-30T10:38:05.587 に答える
3

z.dumps()すでにピクルされた文字列です。つまり、pickle.loads() を使用してアンピクルすることができます。

>>> z = numpy.zeros(1000, numpy.uint8)
>>> s = z.dumps()
>>> a = pickle.loads(s)
>>> all(a == z)
True
于 2010-05-11T07:26:47.573 に答える
1

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"))
于 2010-05-09T21:46:27.037 に答える