Python
bzip2
pickle

Pythonオブジェクトを圧縮して保存したい

More than 1 year has passed since last update.

Pythonオブジェクトをファイルに書き込む際には,pickleによる直列化(シリアライズ)を使うのが効率的です.

しかし,pickleシリアライズは,単にオブジェクトを文字列に変換するだけであるため,メモリ・ディスク効率は必ずしも良くありません.

そこで,bz2による圧縮をこれに組み合わせます.以下が,ソースになります.

compressed_pickle.py
import cPickle as pickle
import bz2

def loads(comp):
    return pickle.loads(bz2.decompress(comp))

def dumps(obj):
    return bz2.decompress(pickle.dumps(obj))

def load(fname):
    fin = bz2.BZ2File(fname, 'rb')
    try:
        pkl = fin.read()
    finally:
        fin.close()
    return pickle.loads(pkl)

def dump(obj, fname, level=9):
    pkl = pickle.dump(obj)
    fout = bz2.BZ2File(fname, 'wb', compresslevel=level)
    try:
        fout.write(pkl)
    finally:
        fout.close()

利用するときには,こんな感じになります.

test.py
import compressed_pickle as pickle

# object
text = 'This implementation is written by @_akisato.'

# write to a file
outname = 'simple_text.pkl.bz2'
pickle.dump(text, outname)

# read from a file
inname = 'simple_text.pkl.bz2'
text2 = pickle.load(inname)

# dump to a memory
comp = pickle.dumps(text)

# load from a memory
text3 = pickle.loads(comp)