2009-02-10 8 views
7

मैं बस इतना करना चाहता हूं कि तारों या स्याही के tuples serialize और unserialize है।पाइथन में मूल प्रकार के लिए हल्के अचार?

मैंने pickle.dumps() पर देखा लेकिन बाइट ओवरहेड महत्वपूर्ण है। असल में ऐसा लगता है कि इसे लगभग 4x जितना अधिक स्थान लेना पड़ता है। इसके अलावा, मुझे केवल बुनियादी प्रकार की आवश्यकता है और वस्तुओं को क्रमबद्ध करने की आवश्यकता नहीं है।

अंतरिक्ष के मामले में मार्शल थोड़ा बेहतर है लेकिन परिणाम बुरा \ x00 बाइट से भरा है। आदर्श रूप में मैं परिणाम मानव पठनीय होना चाहता हूं।

मैंने केवल repr() और eval() का उपयोग करने के बारे में सोचा, लेकिन क्या यह एक आसान तरीका है जिसे मैं eval() का उपयोग किये बिना पूरा कर सकता हूं?

यह एक डीबी में संग्रहीत हो रहा है, फाइल नहीं। बाइट ओवरहेड मायने रखता है क्योंकि यह एक वर्चुअल बनाम टेक्स्ट कॉलम की आवश्यकता के बीच अंतर बना सकता है, और आम तौर पर डेटा कॉम्पैक्टनेस डीबी प्रदर्शन के सभी क्षेत्रों को प्रभावित करता है।

+0

ओवरहेड * एक अचार डंप के लिए महत्वपूर्ण है! –

+2

ब्रिस्टल स्टूल चार्ट यह जानने के लिए एक उत्कृष्ट संसाधन है कि आप किस प्रकार के गंदा \ x00 बाइट्स का सामना कर रहे हैं http://en.wikipedia.org/wiki/File:Bristol_Stool_Chart.png –

+0

कॉन्फ़िगरर्स के साथ समस्या का सामना करना पड़ता है? –

उत्तर

13

json पर एक नजर डालें, कम से कम उत्पन्न dumps कई अन्य भाषाओं के साथ पठनीय हैं।

JSON (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन) http://json.org जावास्क्रिप्ट वाक्य रचना (ECMA-262 3 संस्करण) एक हल्के डाटा इंटरचेंज प्रारूप के रूप में इस्तेमाल का एक सबसेट है।

1

python documentation में उल्लिखित कुछ दृढ़ता वाले अंतर्निहित हैं लेकिन मुझे नहीं लगता कि इनमें से कोई भी उत्पादित फाइलसाइज में उल्लेखनीय छोटा है।

आप हमेशा configparser का उपयोग कर सकते हैं लेकिन वहां आपको केवल स्ट्रिंग, int, float, bool मिलते हैं।

0

"बाइट भूमि के ऊपर से महत्वपूर्ण है"

इस समस्या क्यों है? यह नौकरी करता है। यदि आप डिस्क स्थान पर कम चल रहे हैं, तो मुझे आपको $ 500 के लिए 1Tb बेचने में खुशी होगी।

क्या आपने इसे चलाया है? प्रदर्शन एक समस्या है? क्या आप दिखा सकते हैं कि क्रमबद्धता का प्रदर्शन समस्या है?

"मैंने केवल repr() और eval() का उपयोग करने के बारे में सोचा था, लेकिन क्या यह एक आसान तरीका है जिसे मैं eval() का उपयोग किये बिना पूरा कर सकता हूं?"

repr और eval से कुछ भी आसान नहीं है।

eval के साथ क्या गलत है?

क्या कोई "फाइल में दुर्भावनापूर्ण कोड डाल सकता है जहां मैंने अपनी सूचियों को क्रमबद्ध किया" मुद्दा?

कौन - विशेष रूप से - इस फ़ाइल को दुर्भावनापूर्ण कोड में डालने और संपादित करने जा रहा है? इसे सुरक्षित करने के लिए आप जो कुछ भी करते हैं (यानी, एन्क्रिप्शन) इससे "सरल" हटा देता है।

+0

eval के साथ समस्या यह है: आपको स्वयं को गलती करने की आवश्यकता है (उदा। टाइपो)। –

+0

आप किस त्रुटि की उम्मीद कर रहे हैं? आपने इसे repr के साथ बनाया है। क्या हो सकता है? –

+0

यह क्यों मायने रखता है ?: यह वर्चर या टेक्स्ट कॉलम में स्टोर करने में सक्षम होने के बीच अंतर बना सकता है - विशेष रूप से - दुर्भावनापूर्ण कोड डालने के लिए इस फ़ाइल को खोजने और संपादित करने जा रहा है ?: मानक विशेषाधिकार वृद्धि भेद्यता। –

8

व्यक्तिगत रूप से मैं yaml का प्रयोग करेंगे। यह एन्कोडिंग आकार के लिए जेसन के बराबर है, लेकिन यह आवश्यक होने पर कुछ और जटिल चीजों (जैसे वर्ग, रिकर्सिव संरचना) का प्रतिनिधित्व कर सकता है।

In [1]: import yaml 
In [2]: x = [1, 2, 3, 'pants'] 
In [3]: print(yaml.dump(x)) 
[1, 2, 3, pants] 

In [4]: y = yaml.load('[1, 2, 3, pants]') 
In [5]: y 
Out[5]: [1, 2, 3, 'pants'] 
8

शायद आप ठीक प्रोटोकॉल का उपयोग नहीं कर रहे हैं:

>>> import pickle 
>>> a = range(1, 100) 
>>> len(pickle.dumps(a)) 
492 
>>> len(pickle.dumps(a, pickle.HIGHEST_PROTOCOL)) 
206 

pickle data formats के दस्तावेज़ देखें।

-1

सौभाग्य से समाधान है जो कंप्रेसर का उपयोग करता है, और हल करता है जिसमें किसी भी मनमानी पायथन ऑब्जेक्ट शामिल है जिसमें नई कक्षाएं शामिल हैं। केवल टुपल को माइक्रो-प्रबंधित करने के बजाय कभी-कभी DRY टूल का उपयोग करना बेहतर होता है।
आपका कोड अधिक कुरकुरा होगा और इसी तरह की भविष्य की स्थितियों में को तुरंत प्रतिक्रिया देगा। SQLite

साथ

y_serial.py मॉड्यूल :: गोदाम पायथन वस्तुओं

"क्रमबद्धता + हठ :: कोड की कुछ लाइनों में, सेक और व्याख्या अजगर SQLite में वस्तुओं, तो बाद में किसी भी एसक्यूएल बिना खोजशब्दों द्वारा कालक्रम के अनुसार उन्हें पुनः प्राप्त स्कीमा-कम डेटा स्टोर करने के लिए डेटाबेस के लिए सबसे उपयोगी "मानक" मॉड्यूल। "

http://yserial.sourceforge.net

[आप अभी भी चिंतित हैं, तो क्यों में एक शब्दकोश उन tuples छड़ी नहीं है, तो y_serial शब्दकोश में लागू होते हैं। शायद किसी भी भूमि के ऊपर zlib द्वारा पृष्ठभूमि में पारदर्शी संपीड़न के कारण गायब हो जाएगा।]

पठनीयता के रूप में, प्रलेखन भी विवरण पर क्यों cPickle json चुना गया था देता है।

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