読者です 読者をやめる 読者になる 読者になる

計算物理屋の研究備忘録

Linux, Cygwin, Mac, zsh, emacs等の使い方、設定などのメモ

pickleの代わりにjoblibを使って永続化する

joblib.dumpの方が簡単で効率的

プログラムの出力結果をpythonでpandasなどを使って処理してmatplotlibで絵を描くということをよくやる。pythonで加工したデータをなるべく容量小さくまとめて、pythonのオブジェクト形式?を保ったまま保存したい。

デフォルトでpickleを使って圧縮すればできるかもしれないが、joblibを使えば簡単にできる。内部ではpickleを使っている?

使い方メモ

とにかく保存したいものをタプルとかリストにまとめておいて、joblib.dumpする。joblibは事前にインストールが必要。condaとかpipでやっておく

import joblib
a = 3.1415         # 数値
b = [1, 0, 1, 0]   # リスト
c = xxx_dataframe  # pandasのデータフレーム
data = (a, b, c)
joblib.dump(data, 'pydata', compress=3)

joblib.dumpの第二引数はファイル名でなんでもよい。compressオプションで圧縮レベルを指定している。公式のヘルプに書いてあって、1〜9までの数値で大きいほうが圧縮レベルが大きい。通常3くらいが推奨されている。compressを有効にするだけで劇的にファイルサイズが小さくなるのでおすすめ。いろいろ数値を変えて試してみたら、確かに圧縮レベルをあげるとサイズが小さくなった。でもそこまで変わるわけではなさそうなので3くらいでいい。

compressオプションを指定しないと、分割して効率よく保存される。分割じゃなくてどちらかといえば一つにまとめて、サーバーからローカルに持ってきたりしたいので基本的には圧縮する。

読み込んで使う時も簡単で、joblib.loadを使うだけ。pickleとほぼ一緒

import joblib
a, b, c = joblib.load('pydata')