34

複数のユーザー定義クラスを含む大きなオブジェクトを作成するコードを実行しています。後で使用するためにシリアル化する必要があります。私が言えることは、ピクルスだけが私の要件に十分に対応できることです。cPickle を使用してそれらを格納していますが、500 MB のメモリで実行されるコードから生成されるオブジェクトのサイズは約 40G です。シリアル化の速度は問題ではありませんが、オブジェクトのサイズは問題です。ピクルスを小さくするために使用できるヒントや代替プロセスはありますか?

4

3 に答える 3

48

pickle を使用する必要があり、他のシリアル化方法が機能しない場合は、いつでも pickle を にパイプできますbzip2。唯一の問題はbzip2、少し遅いことです...gzipより高速になるはずですが、ファイルサイズはほぼ2倍大きくなります:

In [1]: class Test(object):
            def __init__(self):
                self.x = 3841984789317471348934788731984731749374
                self.y = 'kdjsaflkjda;sjfkdjsf;klsdjakfjdafjdskfl;adsjfl;dasjf;ljfdlf'
        l = [Test() for i in range(1000000)]

In [2]: import cPickle as pickle          
        with open('test.pickle', 'wb') as f:
            pickle.dump(l, f)
        !ls -lh test.pickle
-rw-r--r--  1 viktor  staff    88M Aug 27 22:45 test.pickle

In [3]: import bz2
        import cPickle as pickle
        with bz2.BZ2File('test.pbz2', 'w') as f:
            pickle.dump(l, f)
        !ls -lh test.pbz2
-rw-r--r--  1 viktor  staff   2.3M Aug 27 22:47 test.pbz2

In [4]: import gzip
        import cPickle as pickle
        with gzip.GzipFile('test.pgz', 'w') as f:
            pickle.dump(l, f)
        !ls -lh test.pgz
-rw-r--r--  1 viktor  staff   4.8M Aug 27 22:51 test.pgz

のファイル サイズbzip2は約 40 分の 1、20分の 1gzipです。また、gzip は生の cPickle にかなり近いパフォーマンスを示しています。

cPickle : best of 3: 18.9 s per loop
bzip2   : best of 3: 54.6 s per loop
gzip    : best of 3: 24.4 s per loop
于 2013-08-27T20:47:47.520 に答える