2011-04-19 26 views
6

मैं एक ऐसी परियोजना पर हूं जो डाटा स्टोरेज के लिए .csv फ़ाइलों के उपयोग का भारी समर्थन करता है। मैं विशेष रूप से संबंधपरक डेटा संग्रहीत करने के लिए .csv का उपयोग करने के साथ कई मुद्दों को देखता हूं। पार्सिंग .csv आमतौर पर pain है, विशेष रूप से विज्ञापन-कॉल कॉलम आकलन का उपयोग करते समय।.csv प्रारूप में फ़ाइलों को संग्रहीत करने के लिए कुछ "मुख्यधारा" हल्के विकल्प क्या हैं?

मैंने एक्सएमएल और न्यूनतम डेटाबेस जैसे SQLite के उपयोग की वकालत की है, लेकिन मैं "तेज़, बेहतर, सस्ता" विकल्प ढूंढ रहा हूं।

.csv फ़ाइलों के लिए कुछ अन्य, "मुख्यधारा" हल्के विकल्प क्या हैं?

इसके अलावा, CouchDB के बारे में क्या। लाइटवेट-नेस के मामले में यह SQLite की तुलना कैसे करता है?

संपादित करें: मुझे याद आया। इस सवाल को before से पूछा गया है।

उत्तर

3

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

ऐसा कहा जा रहा है कि, जब मैं अपने नियंत्रण में डेटा करता हूं तो मैं अक्सर SQLite का चयन करता हूं।

SQLite का उपयोग लगातार उसी टूलिंग का उपयोग करने के लिए उधार देता है, जिसे एक विज्ञापन-स्टोर स्टोर या रिलेशनल मॉडल के रूप में उपयोग किया जा सकता है, में "स्टैंडअलोन" आरडीबीएमएस के लिए 'स्टेप अप' योजना है, डीक्यूएल "मुफ्त में" प्रदान करता है (जो मेरे लिए एक बड़ा प्लस है), आदि। जब तक अंतरिक्ष एक वास्तविक मुद्दा नहीं है या डेटा-एक्सेस के लिए समर्थन नहीं है, क्यों नहीं? (आधुनिक फ़ायरफ़ॉक्स भी SQLite का उपयोग करता है)।

(वहां कई ऑब्जेक्ट-डेटाबेस हैं, जैसे कि डीबी 4 ओ भी - या यहां तक ​​कि सरल कुंजी/मूल्य पदानुक्रमित स्टोर इत्यादि। एसक्यूएलएट एक माइक्रो/एम्बेडेड डेटाबेस।)

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

जेएसओएन जैसे अन्य प्रारूप भी बाहर हैं - लेकिन यदि प्रारूप अपारदर्शी है तो यह वास्तव में एक्सएमएल पर कोई फर्क नहीं पड़ता है (यह टूलींग सपोर्ट के मामले में अधिक है)।

तो ... "यह निर्भर करता है"।

0

एक्सएमएल मुख्यधारा और सापेक्ष "लाइटवेट" होने के लिए डिज़ाइन किया गया है। जेएसओएन एक और लोकप्रिय विकल्प है लेकिन डाटा स्टोरेज के विपरीत मॉडलिंग ऑब्जेक्टिंग के लिए अधिक उपयुक्त है।

यदि आप संबंधपरक क्वेरीिंग क्षमताओं की आवश्यकता है तो MySQL एक अच्छा विकल्प है।

+4

मुझे लगता है कि लोगों की है कि एक्सएमएल तर्क है की एक बहुत कुछ बेहद भारी है। जेएसओएन एक्सएमएल के वजन के कारण डिजाइन किया गया था ... –

0

यह सब कुछ उपयोग-मामले के बारे में है।

अंगूठे का मेरा नियम: डेटा के दो टुकड़ों के बीच निर्भरता या संबंध होने पर SQLite का उपयोग करें; सीएसवी (या कुछ अन्य "फ्लैट" प्रारूप) का उपयोग करें यदि यह केवल फ्लैट डेटा फाइलें हैं। सबसे आसान चीज जो सिर्फ काम करती है वह अक्सर सबसे विश्वसनीय समाधान भी होती है।

(नोट: सुनिश्चित करें कि सीएसवी अच्छी तरह से गठित है।किसी को भी खराब सीएसवी कार्यान्वयन के आसपास हैक करना पसंद नहीं है।)

1

ऐसा लगता है कि YAML एक्सएमएल जैसे स्वरूपों की तुलना में अपेक्षाकृत छोटा है, लेकिन जेएसओएन (यह एक सुपरसेट है) से थोड़ा अधिक वर्णनात्मक है। यह एक और उम्मीदवार है जिसे मैं मानता हूं।

1

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

पायथन में, Pandas + PyTables उपयोग करने में बहुत आसान है। पांडा documentation से उदाहरण:

In [259]: store = HDFStore('store.h5') 

In [260]: print(store) 
<class 'pandas.io.pytables.HDFStore'> 
File path: store.h5 
Empty 
Objects can be written to the file just like adding key-value pairs to a dict: 

In [261]: np.random.seed(1234) 

In [262]: index = date_range('1/1/2000', periods=8) 

In [263]: s = Series(randn(5), index=['a', 'b', 'c', 'd', 'e']) 

In [264]: df = DataFrame(randn(8, 3), index=index, 
    .....:    columns=['A', 'B', 'C']) 
    .....: 

In [265]: wp = Panel(randn(2, 5, 4), items=['Item1', 'Item2'], 
    .....:   major_axis=date_range('1/1/2000', periods=5), 
    .....:   minor_axis=['A', 'B', 'C', 'D']) 
    .....: 

# store.put('s', s) is an equivalent method 
In [266]: store['s'] = s 

In [267]: store['df'] = df 

In [268]: store['wp'] = wp 

# the type of stored data 
In [269]: store.root.wp._v_attrs.pandas_type 
Out[269]: 'wide' 

In [270]: store 
Out[270]: 
<class 'pandas.io.pytables.HDFStore'> 
File path: store.h5 
/df   frame  (shape->[8,3]) 
/s    series  (shape->[5])  
/wp   wide   (shape->[2,5,4])