joblibとpickleの異なるユースケースは何ですか?


85

背景:私はscikit-learnを始めたばかりで、ページの下部にあるjoblibとpickleについて読んでいます。

ビッグデータではより効率的ですが、文字列ではなくディスクにのみピクルスできる、joblibのピクルスの置き換え(joblib.dump&joblib.load)を使用する方が興味深い場合があります。

Pythonでのpickleの一般的なユースケースであるPickleに関するこのQ&Aを読み ましたが、ここのコミュニティでjoblibとpickleの違いを共有できるかどうか疑問に思います。いつ使用する必要がありますか?

回答:


97
  • joblibは、numpyデータ構造の配列バッファーを特別に処理するため、通常、大きなnumpy配列では大幅に高速になります。実装の詳細については、ソースコードをご覧ください。また、zlibまたはlz4を使用してピクルス化しながら、そのデータをオンザフライで圧縮することもできます。
  • joblibを使用すると、ロード時に、圧縮されていないjoblibで選択されたnumpy配列のデータバッファーをメモリマップすることもできます。これにより、プロセス間でメモリを共有できます。
  • 大きなnumpy配列をピクルスしない場合、特に小さなpythonオブジェクトの大きなコレクション(たとえば、strオブジェクトの大きなdict)では、通常のピクルスが大幅に高速化されます。純粋なPython。
  • PEP 574(Pickleプロトコル5)がPython 3.8にマージされたため、標準ライブラリを使用して大きなnumpy配列をpickle化する方がはるかに効率的です(メモリ単位およびCPU単位)。このコンテキストでの大きなアレイは、4GB以上を意味します。
  • ただし、joblibは、Python 3.8でも、ネストされたnumpy配列を持つオブジェクトをロードするのに役立ちます。、メモリマップモードでますmmap_mode="r"

1
どうもありがとう!これは役に立ちます。
msunbot 2012

2
それは我々が使用する必要があることを意味していJoblib超えますかPickleJoblib考慮すべきデメリットはありますか?Joblib最近聞いたばかりですが、面白そうですね。
Catbuilts

2
標準ライブラリで起こっている欠点や新しいことで答えを更新しました。
ogrisel

2
joblibは、解析解除中に任意のコードも実行しますか?(危険)
ミスター・プログラム

これはすべての「注意...」を読んで1行の要約を取得するのは難しいですjoblibは3.8で大きなnumpy配列を書くのにX倍高速です、おおよそXは何ですか?と読むために?そして、pickleはたくさんの小さなPythonオブジェクトを書くのにおよそY倍速いです、Yとは何ですか?と読むために?また、相対的な圧縮率/ファイルサイズはどのくらいですか?
SMCI

12

このスクリプトを提供してくれたGunjanに感謝します!Python3の結果に合わせて変更しました

#comapare pickle loaders
from time import time
import pickle
import os
import _pickle as cPickle
from sklearn.externals import joblib

file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'database.clf')
t1 = time()
lis = []
d = pickle.load(open(file,"rb"))
print("time for loading file size with pickle", os.path.getsize(file),"KB =>", time()-t1)

t1 = time()
cPickle.load(open(file,"rb"))
print("time for loading file size with cpickle", os.path.getsize(file),"KB =>", time()-t1)

t1 = time()
joblib.load(file)
print("time for loading file size joblib", os.path.getsize(file),"KB =>", time()-t1)

time for loading file size with pickle 79708 KB => 0.16768312454223633
time for loading file size with cpickle 79708 KB => 0.0002372264862060547
time for loading file size joblib 79708 KB => 0.0006849765777587891

Gunjanは1154320653KBのpickleファイルを使用しました。より大きなファイルはjoblibを支持して違いを生むことができますか?
guiferviz

2
パフォーマンスの数値を表示するときは、常にPythonのバージョンを明記してください。2.6?2.7?3.6?3.7?さらに良いことに、joblib対pickle対cPickleの相対数を報告します。また、ない1.1 TB 1.1ギガバイトのGunjanのミスを修正
SMCI

8

同じ質問に出くわしたので、大きなピクルスファイルをロードする必要があるので、これを(Python 2.7で)試しました

#comapare pickle loaders
from time import time
import pickle
import os
try:
   import cPickle
except:
   print "Cannot import cPickle"
import joblib

t1 = time()
lis = []
d = pickle.load(open("classi.pickle","r"))
print "time for loading file size with pickle", os.path.getsize("classi.pickle"),"KB =>", time()-t1

t1 = time()
cPickle.load(open("classi.pickle","r"))
print "time for loading file size with cpickle", os.path.getsize("classi.pickle"),"KB =>", time()-t1

t1 = time()
joblib.load("classi.pickle")
print "time for loading file size joblib", os.path.getsize("classi.pickle"),"KB =>", time()-t1

このための出力は

time for loading file size with pickle 1154320653 KB => 6.75876188278
time for loading file size with cpickle 1154320653 KB => 52.6876490116
time for loading file size joblib 1154320653 KB => 6.27503800392

このjoblibによると、これら3つのモジュールのcPickleおよびPickleモジュールよりもうまく機能します。ありがとう


2
ピクルスはピクルスよりも速いはずだと思いましたか?
エコー2016年

このベンチマークは、デフォルトでpickle(protocol = 3)を使用するpython 3で実行されますか(python2のデフォルトよりも高速です)?
LearnOPhile 2017

3
os.path.getsizeはキロバイトではなくバイトを返すので、約1,1 GBのファイルについて話します(出力からのように1,1 TBではありません)
VladIliescu19年

これは素晴らしいことですが、1.1TBではなく1.1GBを反映するように出力を修正してください。Pythonバージョン3.6、3.7、3.8、2.7の場合、joblib、pickle、cPickleの場合、1KB ... 10GBから10の累乗でファイルサイズの比較数値をプロットする方がよいでしょう。
SMCI
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.