2009-03-30 16 views
9

अचार मॉड्यूल स्ट्रिंग भागने पात्रों जब नमकीन बनाना उपयोग करने के लिए लगता है, यह अक्षम हो जाता है उदा। numpy arrays पर। पर विचार करें निम्नलिखितअधिक कुशल एक स्ट्रिंग अचार के लिए रास्ता

z = numpy.zeros(1000, numpy.uint8) 
len(z.dumps()) 
len(cPickle.dumps(z.dumps())) 

लंबाई क्रमश: 1133 अक्षर और 4249 अक्षर हैं।

z.dumps() "\ x00 \ x00" (स्ट्रिंग में वास्तविक शून्य) जैसे कुछ बताता है, लेकिन अचार स्ट्रिंग के repr() फ़ंक्शन का उपयोग कर रहा है, जो "\ x00 \ x00 '" उत्पन्न करता है (शून्य Ascii शून्य)।

यानी (== झूठी "0" z.dumps() में) और ("0" cPickle.dumps में (z.dumps()) == यह सच है)

+0

आप अपनी पोस्ट करने के लिए एक विशिष्ट प्रश्न जोड़ना चाहिए वह कर रहे हैं। –

+0

आप एक पायथन स्ट्रिंग या बाइट्स की एक numpy सरणी क्रमबद्ध करना चाहते हैं? – jfs

+1

लेन किया जाना चाहिए (cPickle.dumps (z)) – vartec

उत्तर

23

के बाद के संस्करण का उपयोग करके देखें pickle.dumps() पर प्रोटोकॉल पैरामीटर के साथ अचार प्रोटोकॉल। डिफ़ॉल्ट 0 है और एक ASCII पाठ प्रारूप है। 1 से अधिक लोग (मेरा सुझाव है कि आप pickle.HIGHEST_PROTOCOL का उपयोग करें)। प्रोटोकॉल प्रारूप 1 और 2 (और 3 लेकिन यह py3k के लिए है) बाइनरी हैं और अधिक जगह रूढ़िवादी होना चाहिए।

+0

[अजगर 3 प्रोटोकॉल 3 डिफ़ॉल्ट रूप से उपयोग करता है।] (Https://docs.python.org/3/library/pickle.html#data-stream-format) –

8

समाधान:

import zlib, cPickle 

def zdumps(obj): 
    return zlib.compress(cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL),9) 

def zloads(zstr): 
    return cPickle.loads(zlib.decompress(zstr)) 

>>> len(zdumps(z)) 
128 
+0

यहाँ विषय पर कुछ और: http://tinyurl.com/3ymhaj5। असल में, यदि आप डिस्क पर क्रमबद्ध कर रहे हैं तो आप खुले के बजाय gzip.open() कर सकते हैं। –

+0

@ slack3r वह लिंक मर चुका है। – kynan

+0

'ascii' कोडेक चरित्र सांकेतिक शब्दों में बदलना नहीं कर सकते यू '\ XDA' स्थिति 1: सीमा में नहीं क्रमसूचक (128) –

1

vartec के जवाब में एक सुधार, कि (एक स्ट्रिंग में के बाद से यह सब कुछ के लिए मजबूर नहीं करता है) में थोड़ा और अधिक स्मृति कुशल लगता है:

def pickle(fname, obj): 
    import cPickle, gzip 
    cPickle.dump(obj=obj, file=gzip.open(fname, "wb", compresslevel=3), protocol=2) 

def unpickle(fname): 
    import cPickle, gzip 
    return cPickle.load(gzip.open(fname, "rb")) 
+0

-1 (1) क्या हार्ड-कोड नहीं प्रोटोकॉल नंबर, उपयोग '-1' या' HIGHEST_PROTOCOL' । (2) बाद में संपीड़न एक एडीडी-ऑन है और अपने प्रश्न के लिए अप्रासंगिक है। (3) डिकंप्रेसिंग होने पर 'संपीड़न' निर्दिष्ट करना व्यर्थ है; किसी भी तरह की जानकारी फ़ाइल को संपीड़ित करने के लिए आवश्यक हो सकता है कि संपीड़ित फ़ाइल के शीर्षक में संग्रहीत किया जाएगा - अन्यथा कैसे आप एक फ़ाइल को संपीड़ित यदि आप नहीं पता था कि क्या संपीड़न स्तर इस्तेमाल किया गया था में सक्षम हो जाएगा? –

+0

(1) फिर py2 कोड py3 ऑब्जेक्ट्स नहीं पढ़ेगा। (2) हैडर कहते हैं, जो संपीड़न उपयोग कर रहा था "vartec के जवाब देने के लिए एक सुधार" - मैं इसे कम मेम इस्तेमाल किया लगता है, लेकिन यह एक गलत धारणा ... (3) तय हो सकता था – gatoatigrado

3

z.dumps() पहले से ही मसालेदार है स्ट्रिंग यानी, यह pickle.loads() का उपयोग कर unpickled जा सकता है:

>>> z = numpy.zeros(1000, numpy.uint8) 
>>> s = z.dumps() 
>>> a = pickle.loads(s) 
>>> all(a == z) 
True