2011-10-25 13 views
11

पाइथन के लिए SQLite (sqlite3, atpy) और HDF5 (h5py, pyTables) के साथ इंटरफ़ेस करने के लिए कई विकल्प प्रतीत होते हैं - मुझे आश्चर्य है कि किसी को इनका उपयोग करने का अनुभव है या नहीं एक साथ numpy arrays या डेटा टेबल (संरचित/रिकॉर्ड सरणी) के साथ, और इनमें से कौन सा सबसे सहजता प्रत्येक डेटा प्रारूप (SQLite और HDF5) के लिए "वैज्ञानिक" मॉड्यूल (numpy, scipy) के साथ एकीकृत है।एसक्यूलाइट और एचडीएफ 5 प्रारूपों में numpy, scipy से निर्यात/आयात करने के लिए

+0

क्या आप SQLite तालिकाओं में numpy डेटा सहेजने के बारे में पूछ रहे हैं? –

+0

हां, इसका हिस्सा ... – hatmatrix

उत्तर

21

इसमें से अधिकांश आपके उपयोग के मामले पर निर्भर करता है।

मैं एक बहुत अधिक परंपरागत रिलेशनल डेटाबेस से विभिन्न HDF5 आधारित विधियों के साथ काम कर अनुभव है, इसलिए मैं अजगर के लिए SQLite पुस्तकालयों पर बहुत ज्यादा टिप्पणी नहीं कर सकता ...

कम से कम जहाँ तक h5py रूप बनाम pyTables, वे दोनों numpy arrays के माध्यम से बहुत सहज पहुंच प्रदान करते हैं, लेकिन वे बहुत अलग उपयोग मामलों की ओर उन्मुख हैं।

आप n आयामी डेटा है कि आप जल्दी से एक मनमाना सूचकांक आधारित का टुकड़ा का उपयोग करना चाहते हैं, तो यह h5py उपयोग करने के लिए और अधिक आसान है। यदि आपके पास डेटा है जो अधिक टेबल जैसा है, और आप इसे क्वेरी करना चाहते हैं, तो pyTables एक बेहतर विकल्प है।

h5pypyTables की तुलना में एचडीएफ 5 पुस्तकालयों के आसपास अपेक्षाकृत "वेनिला" रैपर है। यह एक बहुत अच्छी बात है यदि आप नियमित रूप से किसी अन्य भाषा से अपनी एचडीएफ फ़ाइल तक पहुंचने जा रहे हैं (pyTables कुछ अतिरिक्त मेटाडेटा जोड़ता है)। h5pyबहुत कर सकता है, लेकिन कुछ उपयोग मामलों के लिए (उदा। pyTables करता है) आपको चीजों को बदलने में अधिक समय व्यतीत करने की आवश्यकता होगी।

pyTables में वास्तव में अच्छी सुविधाएं हैं। हालांकि, यदि आपका डेटा किसी तालिका की तरह नहीं दिखता है, तो शायद यह सबसे अच्छा विकल्प नहीं है।

एक और ठोस उदाहरण देने के लिए, मैं डेटा के 3 और 4 आयामी सरणी काफी बड़े (जीबी के दस) के साथ बहुत काम करता हूं। वे फ्लोट्स, इन्ट्स, uint8s, आदि के समरूप सरणी हैं। मैं आमतौर पर पूरे डेटासेट के एक छोटे से सबसेट का उपयोग करना चाहता हूं। h5py यह बहुत सरल बनाता है, और एक उचित हिस्सा आकार के ऑटो अनुमान लगाने का एक अच्छा काम करता है। एक मनमानी खंड या डिस्क से टुकड़ा पकड़ना एक साधारण memmapped फ़ाइल के मुकाबले बहुत तेज है। (मनमाने ढंग से जोर ... स्पष्ट रूप से, यदि आप एक संपूर्ण "एक्स" टुकड़ा पकड़ना चाहते हैं, तो एक सी-ऑर्डर किए गए memmapped सरणी को हरा करना असंभव है, क्योंकि "एक्स" स्लाइस में मौजूद सभी डेटा डिस्क पर आसन्न हैं।)

एक काउंटर उदाहरण के रूप में, मेरी पत्नी कई वर्षों में मिनट से दूसरे अंतराल पर नमूने वाले सेंसर की विस्तृत श्रृंखला से डेटा एकत्र करती है। उसे अपने डेटा पर मनमाने ढंग से पूछताछ (और अपेक्षाकृत सरल गणना) को स्टोर और चलाने की जरूरत है। pyTables इस उपयोग के मामले को बहुत आसान और तेज़ बनाता है, और पारंपरिक संबंधपरक डेटाबेस पर अभी भी कुछ फायदे हैं। (विशेष रूप से डिस्क उपयोग और गति के संदर्भ में, जिसमें डेटा का एक बड़ा (इंडेक्स-आधारित) हिस्सा स्मृति में पढ़ा जा सकता है)

+0

धन्यवाद - यह वास्तव में ऐसी जानकारी है जो मैं 'h5py' और 'pyTables'' के विपरीत खोज रहा था ... लेकिन फिर यह आवश्यक नहीं है जो NumPy के साथ जाता है लेकिन जो अच्छी तरह से चला जाता है NumPy सरणी में वास्तविक डेटा के साथ। मैं 'SQLite' भाग को एक अलग प्रश्न के रूप में पोस्ट करूंगा। – hatmatrix

+4

@ जोकिंगटन: साइड नोट: मुझे यकीन नहीं है कि "सी-ऑर्डर किए गए मेमैप्ड सरणी को हरा करना असंभव है": memcpy() के साथ डेटा कॉपी करना संकुचित डेटा को स्थानांतरित करने और प्रोसेसर में आने पर इसे कम करने से धीमा हो सकता है (http: //blosc.pytables.org/trac)।शुद्ध प्रभाव यह है कि संपीड़ित सरणी डेटा संसाधित असंपीड़ित सरणी डेटा संसाधित करने से तेज़ हो सकता है। – EOL

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