2010-10-26 5 views
6

मैं हाल ही में पाइटेबल्स में आया और इसे बहुत अच्छा पाया। यह स्पष्ट है कि वे बहुत बड़े डेटा सेट के लिए एक सीएसवी प्रारूप से बेहतर हैं। मैं अजगर का उपयोग कर कुछ सिमुलेशन चला रहा हूँ। आउटपुट इतना बड़ा नहीं है, 200 कॉलम और 2000 पंक्तियां कहें।फाइलों के लिए पीईटीबल्स बनाम सीएसवी जो बहुत बड़े नहीं हैं

अगर किसी के पास अनुभव है, तो क्या आप सुझाव दे सकते हैं कि ऐसे प्रारूप सेट के लिए लंबे समय तक कौन सा प्रारूप अधिक सुविधाजनक होगा, जो बहुत बड़े नहीं हैं। पायटेबल्स में डेटा मैनिपुलेशन क्षमताओं और विटबेल के साथ डेटा की ब्राउज़िंग है, लेकिन ब्राउज़र में एक्सेल कहने के रूप में अधिक कार्यक्षमता नहीं है, जिसका उपयोग सीएसवी के लिए किया जा सकता है। इसी तरह, क्या आप मुख्य रूप से पायथन में काम करते हुए डेटा आयात और निर्यात करने के लिए दूसरे से बेहतर पाते हैं? फाइल संगठन के मामले में एक और सुविधाजनक है? इस तरह के मुद्दों पर कोई टिप्पणी उपयोगी होगी।

धन्यवाद।

+1

यह संभवतः डेटा के साथ आप क्या कर रहे हैं इस पर निर्भर करता है - यानी आप सुविधा को कैसे परिभाषित करते हैं। क्या आप 1. जब चाहें तो अच्छे दृश्य संपादक के साथ डेटा देखना चाहते हैं 2. शायद एक बार दृष्टि से डेटा जांचें और फिर इसे किसी अन्य प्रोग्राम पर पास करें? यदि आप पहले चाहते हैं और डेटा को 'देखने' के लिए उस कार्यक्षमता की आवश्यकता है तो सीएसवी प्रारूप शायद खराब विकल्प नहीं है। दिया गया 2, pytables शायद अच्छा है। किसी भी मामले में, आपका डेटा छोटा है, क्यों नहीं बचाओ? – Marm0t

उत्तर

5

क्या आपने नम्पी सरणी मानी हैं?

पीईटीबल्स अद्भुत हैं जब आपका डेटा स्मृति में फिट होने के लिए बहुत बड़ा है, लेकिन 8 बाइट फ्लोट्स के 200x2000 मैट्रिक्स के लिए केवल 3 एमबी मेमोरी की आवश्यकता होती है। तो मुझे लगता है कि PyTables अधिक हो सकता है।

आप np.savetxt या np.savez (संपीड़न के लिए) का उपयोग फ़ाइलों को NumPy सरणी बचा सकता है, और np.loadtxt या np.load साथ फ़ाइलों से उन्हें पढ़ सकते हैं।

यदि आपके पास डिस्क पर स्टोर करने के लिए ऐसे कई सरणी हैं, तो मैं numpy .npz फ़ाइलों के बजाय डेटाबेस का उपयोग करने का सुझाव दूंगा। निर्दिष्ट करने के लिए

import sqlite3 
import numpy as np 

db = sqlite3.connect(':memory:') 
cursor = db.cursor() 
cursor.execute('''CREATE TABLE foo 
        (row INTEGER, 
        col INTEGER, 
        value FLOAT, 
        PRIMARY KEY (row,col))''') 
ROWS=4 
COLUMNS=6 
matrix = np.random.random((ROWS,COLUMNS)) 
print(matrix) 
# [[ 0.87050721 0.22395398 0.19473001 0.14597821 0.02363803 0.20299432] 
# [ 0.11744885 0.61332597 0.19860043 0.91995295 0.84857095 0.53863863] 
# [ 0.8.52689885 0.05861043 0.71784406 0.20222138 0.63094807] 
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]] 

# Store matrix in table foo 
cursor.executemany('INSERT INTO foo(row, col, value) VALUES (?,?,?) ', 
        ((r,c,value) for r,row in enumerate(matrix) 
           for c,value in enumerate(row))) 

# Retrieve matrix from table foo 
cursor.execute('SELECT value FROM foo ORDER BY row,col') 
data=zip(*cursor.fetchall())[0] 
matrix2 = np.fromiter(data,dtype=np.float).reshape((ROWS,COLUMNS)) 
print(matrix2) 
# [[ 0.87050721 0.22395398 0.19473001 0.14597821 0.02363803 0.20299432] 
# [ 0.11744885 0.61332597 0.19860043 0.91995295 0.84857095 0.53863863] 
# [ 0.8.52689885 0.05861043 0.71784406 0.20222138 0.63094807] 
# [ 0.01309897 0.45391578 0.04950273 0.93040381 0.41150517 0.66263562]] 

आप कई ऐसे 200x2000 मैट्रिक्स है, तो आप बस एक और तालिका स्तंभ की जरूरत है: वैसे, एक डेटाबेस में एक 200x2000 मैट्रिक्स स्टोर करने के लिए, आप केवल 3 तालिका स्तंभ की जरूरत है: पंक्ति, स्तंभ, मूल्य कौन सा मैट्रिक्स।

+0

यह दिलचस्प लगता है। मुझे डेटाबेस के बारे में ज्यादा जानकारी नहीं है, लेकिन इसमें देखेंगे और वापस पोस्ट करेंगे। आपके उदाहरण से मुझे स्पष्ट नहीं है कि 2000 पंक्तियों में प्रत्येक मान के निर्देशांक x 200 कॉलम मैट्रिक्स डेटाबेस तालिका में असाइन किए जा रहे हैं। मैं इसे समझने की कोशिश करूंगा। – Curious2learn

+0

मुझे नहीं लगता कि मैं प्राथमिक कुंजी के लिए एक अलग 'आईडी' कॉलम का उपयोग करूंगा। पंक्ति/कॉलम एक बेहतर प्राथमिक कुंजी बनाता है, क्योंकि यह वास्तव में उस डेटा के लिए पहचान है। 2000x2000 मैट्रिक्स के लिए, आप चालाक भी प्राप्त कर सकते हैं और पंक्ति और कॉलम दोनों को एक ही पूर्णांक कॉलम में पैक कर सकते हैं, जैसे 'पंक्ति << 16 + col'। – SingleNegationElimination

+0

@TokenMacGuy: धन्यवाद! – unutbu

0

ये "अनन्य" विकल्प नहीं हैं।

आपको दोनों की आवश्यकता है।

सीएसवी सिर्फ एक डेटा एक्सचेंज प्रारूप है। यदि आप pytables का उपयोग करते हैं, तो आपको अभी भी CSV प्रारूप में आयात और निर्यात करने की आवश्यकता है।

+0

क्या आप विस्तृत कर सकते हैं? मुझे pytables का उपयोग करने के लिए CSV फ़ाइलों को बनाने की आवश्यकता नहीं है। धन्यवाद! – Curious2learn

+0

आपको उन अनुप्रयोगों के साथ डेटा का आदान-प्रदान करने के लिए सीएसवी बनाने की आवश्यकता है जो केवल सीएसवी स्वीकार करते हैं। उदाहरण के लिए, स्प्रेडशीट्स। –

2

जहां तक ​​आयात/निर्यात हो जाता है, PyTables HDF5 नामक मानकीकृत फ़ाइल प्रारूप का उपयोग करता है। कई वैज्ञानिक सॉफ्टवेयर पैकेज (जैसे MATLAB) में एचडीएफ 5 के लिए अंतर्निहित समर्थन है, और सी एपीआई भयानक नहीं है। तो इन भाषाओं में से किसी एक को निर्यात करने या आयात करने के लिए आपको जो भी डेटा चाहिए, उसे केवल एचडीएफ 5 फाइलों में रखा जा सकता है।

PyTables अपने स्वयं के कुछ विशेषताओं को जोड़ता है, लेकिन इन्हें आपको चोट नहीं पहुँचना चाहिए। बेशक, यदि आप फ़ाइल में पाइथन ऑब्जेक्ट्स स्टोर करते हैं, तो आप उन्हें कहीं और पढ़ने में सक्षम नहीं होंगे।

सीएसवी फाइलों के बारे में एक अच्छी बात यह है कि वे मानव पठनीय हैं। हालांकि, अगर आपको उनमें सरल संख्याओं के अलावा कुछ भी स्टोर करने की आवश्यकता है और दूसरों के साथ संवाद करना है, तो आपको समस्याएं होंगी। मुझे अन्य संगठनों के लोगों से सीएसवी फाइलें मिलती हैं, और मैंने देखा है कि मनुष्य यह सुनिश्चित करने में अच्छा नहीं हैं कि स्ट्रिंग उद्धरण जैसी चीजें सही तरीके से की जाती हैं। यह अच्छा है कि पायथन का सीएसवी पार्सर उतना ही लचीला है जितना है। एक अन्य मुद्दा यह है कि फ़्लोटिंग पॉइंट नंबर को दशमलव प्रारूप का उपयोग करके पाठ में बिल्कुल संग्रहीत नहीं किया जा सकता है। हालांकि, यह आमतौर पर काफी अच्छा है।

+0

प्रतिक्रिया के लिए धन्यवाद! क्या आप कहेंगे कि वीटेबल्स के साथ, यहां तक ​​कि पीईटीबल्स मानव पठनीय बन जाते हैं। – Curious2learn

+0

ViTables बहुत अच्छा है। लेकिन, यह स्थापित करने के लिए दर्द का कुछ है (शायद हाल ही में)। –

+0

फ्लोट * * एसीआईआई दशमलव में बिल्कुल संग्रहीत किया जा सकता है, लेकिन ऐसा करने के लिए कुछ दशमलव अंकों की आवश्यकता है। यह अक्सर फ्लोट्स के स्ट्रिंग स्वरूपण के लिए डिफ़ॉल्ट नहीं है, हालांकि। – SingleNegationElimination

1

मुझे लगता है कि यह pytables और csv comapre करना बहुत मुश्किल है .. pyTable एक डेटास्ट्रक्चर है जबकि CSV डेटा के लिए एक एक्सचेंज प्रारूप है।

1

यह वास्तव में काफी पढ़ने/लिखने csv फ़ाइलें w/numpy के बारे में एक और उत्तर मैं प्रदान की है से संबंधित है:

Python: how to do basic data manipulation like in R?

आप चाहिए निश्चित रूप से उपयोग numpy, कोई बात नहीं क्या बाकी! इंडेक्सिंग की आसानी, आदि अतिरिक्त निर्भरता की लागत से काफी अधिक है (ठीक है, मुझे ऐसा लगता है)। PyTables, ज़ाहिर है, भी numpy पर निर्भर करता है।

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

मुझे दृढ़ता से संदेह है कि पीईटीबल्स एसक्यूएल से बेहतर प्रदर्शन करेगा। एसक्यूएल जटिल मल्टी-टेबल प्रश्नों पर चलेगा (विशेष रूप से यदि आप अक्सर वही करते हैं), लेकिन एकल-टेबल (जिसे "denormalized" कहा जाता है) टेबल क्वेरी पर भी, गति के संदर्भ में pytables को हरा करना मुश्किल होता है। मैं इस बंद हाथ के लिए एक संदर्भ नहीं मिल सकता है, लेकिन यदि आप लिंक यहाँ मेरी कुछ खुदाई करने के लिए सक्षम हो सकता है:

http://www.pytables.org/moin/HowToUse#HintsforSQLusers

मैं इस स्तर पर आप के लिए प्रदर्शन पर अमल अनुमान लगा रहा हूँ होगा कोडर प्रदर्शन की तुलना में पीला। तो, सबसे ऊपर, कुछ ऐसा चुनें जो आपको सबसे ज्यादा समझ में आता है!

अन्य अंक:

एसक्यूएल के साथ के रूप में, PyTables पूर्ववत सुविधा है। सीएसवी फाइलों में यह नहीं होगा, लेकिन आप उन्हें संस्करण नियंत्रण में रख सकते हैं, और आपको वीसीएस को बहुत स्मार्ट होने की आवश्यकता नहीं है (सीएसवी फाइलें टेक्स्ट हैं)।

संबंधित नोट पर, सीएसवी फाइल बाइनरी प्रारूपों से कहीं अधिक बड़ी होगी (आप निश्चित रूप से इसके लिए अपने स्वयं के परीक्षण भी लिख सकते हैं)।

2

पीईटीबल्स के लिए एक बड़ा प्लस मेटाडेटा का भंडारण है, जैसे वैरिएबल इत्यादि यदि आप सिमुलेशन को अक्सर विभिन्न पैरामीटर के साथ चलाते हैं तो आप परिणामों को एच 5 फाइल में एरे एंट्री के रूप में स्टोर करते हैं।

हम डेटा प्राप्त करने के लिए माप डेटा + प्रयोग स्क्रिप्ट को स्टोर करने के लिए इसका उपयोग करते हैं, इसलिए यह सब स्वयं निहित है।

बीटीडब्लू: यदि आपको एचडीएफ 5 फाइल में जल्दी से देखने की ज़रूरत है तो आप एचडीएफवी व्यू का उपयोग कर सकते हैं। यह एचडीएफ ग्रुप से मुक्त जावा ऐप है। इसे स्थापित करना आसान है।