文字列をpickle化するために、より効率的な方法
-
22-08-2019 - |
質問
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"))
所属していません StackOverflow