117

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

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

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

4

4 に答える 4

144
  • joblibは、numpyデータ構造の配列バッファーを特別に処理するため、通常、大きなnumpy配列では大幅に高速になります。実装の詳細については、ソースコードをご覧ください。また、zlibまたはlz4を使用してピクルスにしながら、そのデータをオンザフライで圧縮することもできます。
  • joblibを使用すると、非圧縮のjoblibで選択されたnumpy配列のデータバッファーをロードするときにメモリマップすることもできます。これにより、プロセス間でメモリを共有できます。
  • 大きなnumpy配列をピクルスしない場合、標準ライブラリのピクルスモジュールはCで実装され、joblibは純粋なPython。
  • PEP 574(Pickleプロトコル5)がPython 3.8にマージされたため、標準ライブラリを使用して大きなnumpy配列をピクルス化する方がはるかに効率的(メモリ単位およびCPU単位)になりました。このコンテキストでの大きなアレイは、4GB以上を意味します。
  • ただし、joblibは、Python 3.8でも、メモリマップモードでネストされたnumpy配列を持つオブジェクトをロードするのに役立ちますmmap_mode="r"
于 2012-09-27T08:56:34.857 に答える
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
于 2018-05-15T23:57:12.340 に答える
9

同じ質問に出くわしたので、大きなピクルスファイルをロードする必要があるので、これを(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モジュールよりもうまく機能します。ありがとう

于 2014-08-07T11:36:33.940 に答える
0

控えめなメモ...Pickleは、適合したscikit-learn推定量/トレーニング済みモデルに適しています。MLアプリケーションでは、トレーニングされたモデルが保存され、主に予測のためにバックアップされます。

于 2021-08-02T08:20:45.937 に答える