2013-08-27 29 views
13

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

import cPickle 
import gzip 

def save_zipped_pickle(obj, filename, protocol=-1): 
    with gzip.open(filename, 'wb') as f: 
     cPickle.dump(obj, f, protocol) 

そして、zip形式の漬け物を再ロードするには:

+0

どのようなpickleプロトコルを使用していますか? – user2357112

+0

プロトコルバージョン0.実質的な違いはありますか? – ddn

+0

違いがあります。しかし、私はどのくらいのものか分からない。 – user2357112

答えて

26

をあなたのために働く、あなたはいつでもbzip2を介してピクルスをパイプすることができます。唯一の問題はbzip2gzipがより速くなるはずです...少しslowishであるということですが、ファイルサイズが大きく、ほぼ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倍小さいことがわかり、 gzipは20倍小さくなります。そして、あなたが見ることができるように、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 
+3

あなたはlzmaを考慮していません。これは非常に優れたアルゴリズムです。私がlzmaを使用して200000の乱数の節約リストを圧縮したとき、gzipとbzip2を叩きました(少なくともsizewise、私は速度をチェックしていません) –

+0

@Viktor cpickleよりも速いシリアル化がありますか? (あなたは他の方法はあなたのために働いていません) – DreamFlasher

+0

@DreamFlasher msgpack、jsonのようなシンプルなシリアライゼーションモジュールがありますが、基本的な型の複雑なPythonオブジェクトを直列化しません。 –

21

あなたはZIPファイルにあなたはcPickle dumpコールを組み合わせることができますが、漬物やシリアライズの無い他の方法を使用する必要がある場合

def load_zipped_pickle(filename): 
    with gzip.open(filename, 'rb') as f: 
     loaded_object = cPickle.load(f) 
     return loaded_object 
+1

load()funcを追加して完成させることができますか? – ealeon

+2

@ealeonが1つ追加されました。 – jozzas

関連する問題