2012-03-27 11 views
14

मैं बाद में उपयोग करने के लिए एक बड़ी (~ 10 ** 6 पंक्तियों, प्रत्येक ~ 20 मानों के साथ) सूची क्रमबद्ध करने की कोशिश कर रहा हूं (इसलिए अचार की सुरक्षा की कमी चिंता नहीं है)।अचार विकल्प

सूची की प्रत्येक पंक्ति कुछ SQL डेटाबेस से व्युत्पन्न मानों का एक गुच्छा है। अब तक, मैंने datetime.datetime, तार, पूर्णांक, और कोई नहीं टाइप किया है, लेकिन मुझे अंततः अतिरिक्त डेटा प्रकारों का समर्थन करना पड़ सकता है।

धारावाहिकरण के लिए, मैंने अचार (सीपीकल), जेसन और सादा पाठ माना है - लेकिन केवल अचार प्रकार की जानकारी बचाता है: जेसन डेटाटाइम डेटाटाइम को क्रमबद्ध नहीं कर सकता है, और सादा पाठ के इसके स्पष्ट नुकसान हैं।

हालांकि, इस बड़े डेटा के लिए सीपीकल बहुत धीमी है, और मैं एक तेज़ विकल्प ढूंढ रहा हूं।

कोई सुझाव?

धन्यवाद!

+1

क्या आपने इसे SQLite डेटाबेस में डंप करने पर विचार किया है? – rmmh

+0

असल में - मैंने नहीं किया है। शायद सबसे सरल हो सकता है ... –

उत्तर

4

मुझे लगता है कि आपको PyTables एक नज़र देना चाहिए। यह आरडीबीएमएस का उपयोग करने से कम से कम तेज़ होना चाहिए, क्योंकि यह बहुत ढीला है और किसी भी पठन/लिखने के प्रतिबंधों को लागू नहीं करता है, साथ ही कम से कम इसे चुनने की तुलना में आपको अपने डेटा के प्रबंधन के लिए एक बेहतर इंटरफ़ेस मिलता है।

+0

आशाजनक लग रहा है। मैं इसे एक शॉट दूंगा - धन्यवाद! –

1

मैं आमतौर पर सादे पाठ (* .csv) को क्रमबद्ध करता हूं क्योंकि मुझे यह सबसे तेज़ लगता है। सीएसवी मॉड्यूल काफी अच्छी तरह से काम करता है। http://docs.python.org/library/csv.html

यदि आपको अपने तारों के लिए यूनिकोड से निपटना है, तो अंत में यूनिकोड रीडर और यूनिकोडवाइटर उदाहरण देखें।

यदि आप अपने भविष्य के उपयोग के लिए क्रमबद्ध करते हैं, तो मुझे लगता है कि यह जानने के लिए पर्याप्त होगा कि आपके पास प्रति सीएसवी कॉलम समान डेटा प्रकार है (उदाहरण के लिए, स्ट्रिंग हमेशा कॉलम 2 पर होती है)।

+0

यह मेरे लिए इतना अच्छा नहीं है - चूंकि यह प्रकार की जानकारी को बनाए रखता नहीं है, इसलिए मुझे डेटा पर लूप करना होगा और इसे परिवर्तित करना होगा, जो बहुत धीमी है (कम से कम मेरे कार्यान्वयन में, सूची समझों की सूची समझ का उपयोग करके)। –

11

अचार वास्तव में बहुत तेज़ है जब तक आप (डिफ़ॉल्ट) ASCII प्रोटोकॉल का उपयोग नहीं कर रहे हैं। बस protocol=pickle.HIGHEST_PROTOCOL का उपयोग करके डंप करना सुनिश्चित करें।

+2

यह ध्यान दिया जाना चाहिए कि दस्तावेज़ों के अनुसार, 'python3' के लिए डिफ़ॉल्ट प्रारूप वास्तव में बाइनरी है। http://docs.python.org/3.4/library/pickle.html?highlight=pickle#pickle – Seanny123

+2

एक अर्थात् बेहतर विकल्प 'प्रोटोकॉल = pickle.HIGHEST_PROTOCOL' –

+1

धन्यवाद, @moose! 'प्रोटोकॉल = -1' से अपडेट किया गया। –

4

प्रोटोकॉल बफ़र्स एक लचीला, कुशल, स्वचालित के लिए संरचित डेटा serializing तंत्र हैं - लगता है एक्सएमएल, लेकिन छोटे, तेज, और सरल होते हैं। एक्सएमएल से अधिक

फायदे:

  • 3 10 को गुना छोटे
  • 20 से 100 गुना तेजी से
  • कम अस्पष्ट
  • डेटा का उपयोग वर्गों है कि आसान है उत्पन्न कर रहे हैं कर रहे हैं सरल हैं प्रोग्रामेटिक रूप से
का उपयोग करने के लिए

https://developers.google.com/protocol-buffers/docs/pythontutorial

3
  • Protocol Buffer - जैसेCaffe में प्रयोग किया जाता है; टाइप जानकारी रखता है, लेकिन आप में यह
  • MessagePack अचार की तुलना में काफी काफी प्रयास किया है: python package देखें - स्ट्रीमिंग का समर्थन (source)
  • BSON: देखने python package docs
0

सरल सैकड़ों हजारों के लिए (JSON-संगत) जटिलता पायथन वस्तुओं पर निर्भर है, मैं के संयोजन के द्वारा सरलता, गति, और आकार का सबसे अच्छा संयोजन मिल गया है:

यह परिमाण के आदेश द्वारा pickle और cPickle विकल्पों धड़कता है।

with gzip.open(filename, 'wb') as f: 
    ubjson.dump(items, f) 


with gzip.open(filename, 'rb') as f: 
    return ubjson.load(f) 
संबंधित मुद्दे