sourcetip

잡립과 피클의 다른 사용 사례는 무엇입니까?

fileupload 2023. 8. 11. 22:30
반응형

잡립과 피클의 다른 사용 사례는 무엇입니까?

배경:저는 스크킷 학습으로 막 시작하고 페이지 하단에서 잡립 피클에 대해 읽고 있습니다.

joblib의 피클 대체품(joblib)을 사용하는 것이 더 흥미로울 수 있습니다.dump & joblib.load)를 사용하면 빅데이터 효율성이 향상되지만 디스크에만 피클링할 수 있고 문자열에는 피클링할 수 없습니다.

Python에서 피클의 일반적인 사용 사례인 Pickle에 대한 이 Q&A를 읽었는데 여기 커뮤니티에서 joblib과 피클의 차이점을 공유할 수 있는지 궁금합니다.어떤 경우에 하나를 다른 하나보다 사용해야 합니까?

  • joblib은 일반적으로 numpy 데이터 구조의 어레이 버퍼에 대해 특별한 처리를 수행하기 때문에 큰 numpy 어레이에서 훨씬빠릅니다.구현 세부 정보에 대해 알아보려면 소스 코드를 확인하십시오.zlib 또는 lz4를 사용하여 피클링 중에 데이터를 즉시 압축할 수도 있습니다.
  • joblib은 또한 압축되지 않은 joblib-dumped numpy 배열을 로드할 때 데이터 버퍼를 메모리 맵할 수 있게 하여 프로세스 간에 메모리를 공유할 수 있게 합니다.
  • 만약 당신이 큰 numpy 배열을 피클하지 않는다면, joblib은 순수한 python인 반면 표준 라이브러리의 피클 모듈은 C에서 구현되기 때문에 일반 피클은 특히 작은 python 객체들의 큰 컬렉션(예: 큰 str 객체 딕트)에서 훨씬 빠를있습니다.
  • PEP 574 (Pickle protocol 5)가 Python 3.8에 병합되었기 때문에, 이제 표준 라이브러리를 사용하여 큰 numpy 배열을 피클하는 것이 훨씬 더 효율적입니다.이 맥락에서 대형 어레이는 4GB 이상을 의미합니다.
  • 그러나 joblib은 Python 3.8에서 메모리 매핑 모드에서 numpy 배열이 중첩된 객체를 로드하는 데 여전히 유용합니다.mmap_mode="r".

이 대본을 주신 건잔 씨에게 감사드립니다.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

저는 같은 질문을 마주쳤기 때문에 큰 피클 파일을 로드해야 하기 때문에 (파이썬 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

이 작업에 따르면 lib는 이 세 모듈의 cPickle 및 Pickle 모듈보다 더 잘 작동합니다.감사해요.

그저 겸손한 메모일 뿐...피클은 적합한 스크킷 학습 추정기/훈련된 모델에 더 적합합니다.ML 애플리케이션에서 훈련된 모델은 주로 예측을 위해 저장되고 다시 로드됩니다.

언급URL : https://stackoverflow.com/questions/12615525/what-are-the-different-use-cases-of-joblib-versus-pickle

반응형