2012-10-11 9 views
6

मैं एक फ़ाइल में एक मसालेदार वस्तु b1.pkl नामित किया है:पाइथन अचार लोड और डंप डिस्क पर किसी ऑब्जेक्ट के आकार को क्यों बढ़ाता है?

$ ls -l b* 
-rw-r--r-- 1 fireball staff 64743950 Oct 11 15:32 b1.pkl 
फिर

मैं वस्तु लोड और एक नई फ़ाइल में यह डंप करने के लिए निम्न अजगर कोड चलाएँ:

import numpy as np 
import cPickle as pkl 

fin = open('b1.pkl', 'r') 
fout = open('b2.pkl', 'w') 

x = pkl.load(fin) 
pkl.dump(x, fout) 

fin.close() 
fout.close() 

फ़ाइल इस कोड बनाता है दो बार के रूप में बड़े से अधिक है:

$ ls -l b* 
-rw-r--r-- 1 fireball staff 64743950 Oct 11 15:32 b1.pkl 
-rw-r--r-- 1 fireball staff 191763914 Oct 11 15:47 b2.pkl 

किसी को भी व्याख्या कर सकते हैं क्यों नई फ़ाइल इतना मूल एक से बड़ा है? इसमें बिल्कुल वही संरचना होनी चाहिए।

+3

उसी प्रोटोकॉल का उपयोग कर मूल अचार था? – root

उत्तर

10

यह हो सकता है कि मूल अचार कुछ अन्य प्रोटोकॉल का उपयोग करे। उदाहरण के लिए protocol=2 को दूसरे pickle.dump पर कीवर्ड तर्क के रूप में निर्दिष्ट करने का प्रयास करें और इसे फिर से जांचें। बाइनरी अचार आकार में बहुत छोटा होना चाहिए।

+0

मैंने प्रोटोकॉल = 2 निर्दिष्ट करने का प्रयास किया और, presto, परिणामस्वरूप फ़ाइल मूल के समान आकार है! – user1389890

+0

तो यह अच्छा है :) – root

3

pkl.dump (x, fout, 2) शायद एक ही फाइलसाइज में परिणाम देगा। प्रोटोकॉल संस्करण निर्दिष्ट नहीं करता है अचार पुराने संस्करण 0.

4

अधिक संभावना है कि आपके मूल b1.pkl को अधिक कुशल प्रोटोकॉल मोड (1 या 2) का उपयोग करके निकाला गया था। तो आपकी फाइल छोटी शुरू होती है।

जब आप सीपीकल के साथ लोड करते हैं, तो यह स्वचालित रूप से फ़ाइल से आपके लिए प्रोटोकॉल का पता लगाएगा। लेकिन जब आप डिफ़ॉल्ट तर्कों के साथ फिर से बाहर निकलते हैं, तो यह प्रोटोकॉल 0 का उपयोग करेगा जो बहुत बड़ा है। यह पोर्टेबिलिटी/संगतता के लिए करता है। आपको बाइनरी प्रोटोकॉल का स्पष्ट रूप से अनुरोध करने की आवश्यकता है।

import numpy as np 
import cPickle 

# random data 
s = {} 
for i in xrange(5000): 
    s[i] = np.random.randn(5,5) 

# pickle it out the first time with binary protocol 
with open('data.pkl', 'wb') as f: 
    cPickle.dump(s, f, 2) 

# read it back in and pickle it out with default args 
with open('data.pkl', 'rb') as f: 
    with open('data2.pkl', 'wb') as o: 
     s = cPickle.load(f) 
     cPickle.dump(s, o) 

$ ls -l 
1174109 Oct 11 16:05 data.pkl 
3243157 Oct 11 16:08 data2.pkl 
+0

जब मैंने मूल को बाहर निकाला, तो मैंने -1 का एक अचार पैरामीटर इस्तेमाल किया। जाहिर है, इसके परिणामस्वरूप डिस्क पर अधिक कॉम्पैक्ट प्रतिनिधित्व हुआ। मुझे लगता है कि यह प्रोटॉन = 2 का उपयोग करने के लिए पाइथन का कारण होना चाहिए। – user1389890

संबंधित मुद्दे