जॉबलिब बनाम अचार के विभिन्न उपयोग के मामले क्या हैं?


85

बैकग्राउंड: मैं सिर्फ स्किकिट-लर्न के साथ शुरू कर रहा हूं, और जॉबलिब, अचार के बारे में पेज के निचले भाग में पढ़ा जा सकता है ।

यह जॉबलिब के अचार के प्रतिस्थापन (joblib.dump & joblib.load) का उपयोग करने के लिए अधिक दिलचस्प हो सकता है, जो बड़े डेटा पर अधिक कुशल है, लेकिन केवल डिस्क को अचार कर सकता है और स्ट्रिंग को नहीं

मैंने इस प्रश्नोत्तर को अचार पर पढ़ा, पाइथन में अचार के लिए सामान्य उपयोग के मामले और आश्चर्य है कि क्या यहाँ का समुदाय जॉबलिब और अचार के बीच के अंतर को साझा कर सकता है? एक दूसरे पर कब इस्तेमाल करना चाहिए?

जवाबों:


97
  • जॉबलीब आम तौर पर बड़ी खस्ता सरणियों पर तेजी से होता है, क्योंकि इसमें खसखस ​​डिटैस्ट्रक्चर के सरणी बफ़र्स के लिए एक विशेष हैंडलिंग है। कार्यान्वयन विवरण के बारे में जानने के लिए आप स्रोत कोड पर एक नज़र डाल सकते हैं । यह भी zlib या lz4 का उपयोग करते हुए मक्खी पर उस डेटा को संपीड़ित कर सकता है।
  • जॉबलिब भी इसे मैप करते समय असम्पीडित जॉबलिब-पिक न्यूमरी एरे के डाटा बफर को मैमोरी मैप करना संभव बनाता है जो कि प्रोसेस के बीच मेमोरी को शेयर करना संभव बनाता है।
  • यदि आप बड़े खट्टे सरणियों को अचार नहीं करते हैं, तो नियमित रूप से अचार काफी तेज हो सकता है, विशेष रूप से छोटे अजगर वस्तुओं के बड़े संग्रह पर (उदाहरण के लिए str ऑब्जेक्ट्स का एक बड़ा तानाशाह), क्योंकि मानक पुस्तकालय का अचार मॉड्यूल joblib के दौरान कार्यान्वित किया जाता है शुद्ध अजगर।
  • चूंकि PEP 574 (अचार प्रोटोकॉल 5) को पायथन 3.8 में विलय कर दिया गया है, यह अब मानक पुस्तकालय का उपयोग करके बड़े खस्ता सरणियों को अचार करने के लिए बहुत अधिक कुशल (मेमोरी-वार और सीपीयू-वार) है। इस संदर्भ में बड़ी सरणियों का अर्थ है 4GB या अधिक।
  • लेकिन जॉबलिब अभी भी पायथन 3.8 के साथ उपयोगी हो सकता है ताकि उन वस्तुओं को लोड किया जा सके जिनके पास मेमोरी मैप्ड मोड में सुन्न सरणियां हैंmmap_mode="r"

1
आपका बहुत बहुत धन्यवाद! यह मददगार है।
msunbot

2
यह मतलब यह है कि हम का उपयोग करना चाहिए Joblibसे अधिक Pickle? किसी भी downsides Joblibकि हम पर विचार करना चाहिए? मैंने अभी Joblibहाल ही में सुना है और यह मेरे लिए दिलचस्प है।
1919 को कैटलिफ्ट

2
मैंने अपने उत्तर को डाउनडाइड्स और मानक पुस्तकालय में होने वाले नए सामान के साथ अद्यतन किया है।
14

2
क्या जॉपरलिब भी अनपर्सिंग के दौरान मनमाने कोड को अंजाम देता है? (असुरक्षित)
मिस्टर-प्रोग्राम्स

यह सभी "नोट दैट ..." के माध्यम से पढ़ना मुश्किल है और एक-पंक्ति सारांश प्राप्त करें: जॉबलीब एक्स में बड़ी संख्यात्मक सरणियों को लिखने के लिए एक्स गुना तेज है, मोटे तौर पर एक्स क्या है? और पढ़ने के लिए? और अचार मोटे तौर पर कई गुना छोटे पायथन वस्तुओं को लिखने के लिए तेजी से वाई है, वाई क्या है? और पढ़ने के लिए? इसके अलावा, रिश्तेदार संपीड़न अनुपात / फ़ाइलें क्या हैं?
बजे

12

हमें यह स्क्रिप्ट देने के लिए गुंजन का धन्यवाद! मैंने इसे पायथन 3 परिणामों के लिए संशोधित किया

#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

गुंजन ने 1154320653 KB अचार फ़ाइल का उपयोग किया। क्या बड़ी फाइल जॉबलिब के पक्ष में बदलाव ला सकती है?
गुरफ्रीज

2
कृपया प्रदर्शन संख्या दिखाते समय कृपया अपना पायथन संस्करण हमेशा बताएं। 2.6? 2.7? 3.6? 3.7? बेहतर अभी भी, रिश्तेदार संख्या joblib बनाम अचार बनाम cPickle की रिपोर्ट करें। इसके अलावा, गुंजन की 1.1 जीबी नहीं 1.1 टीबी की गलती को ठीक करें
23

8

मैं एक ही सवाल पर आया था, इसलिए मैंने इसे एक (पायथन 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

इसके अनुसार जॉबली इन 3 मॉड्यूल से cPickle और अचार मॉड्यूल से बेहतर काम करता है। धन्यवाद


2
मैंने सोचा कि अचार से अचार जल्दी बनना चाहिए?
इको

क्या यह बेंचमार्क पायथन 3 के साथ किया गया है, जो डिफ़ॉल्ट रूप से अचार (प्रोटोकॉल = 3) का उपयोग करता है (जो कि python2 में डिफ़ॉल्ट से तेज है)?
LearnOPhile

3
os.path.getize बाइट्स किलोबाइट नहीं है, इसलिए हम लगभग 1,1 जीबी की एक फ़ाइल के बारे में बात कर रहे हैं (और यह टीबी की तरह 1,1 टीबी नहीं है जैसा कि आउटपुट से लगता है)
व्लाद Iliescu

यह बहुत अच्छा है, लेकिन यह 1.1 जीबी नहीं 1.1 टीबी को प्रतिबिंबित करने के लिए आउटपुट को ठीक करें। बेहतर अभी भी 1KB से 10-शक्तियों में फ़ाइलों के लिए तुलनात्मक संख्याओं की साजिश रच रहा होगा ... 10 जीबी, पायथन संस्करणों के लिए 3.6, 3.7, 3.8 और 2.7, जॉबलिब, अचार और सीपिकल के लिए।
स्माइली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.