2012-08-06 6 views
19

मेरे पास अद्वितीय कुंजी-मूल्य जानकारी की 400 मिलियन लाइनें हैं जिन्हें मैं एक स्क्रिप्ट में त्वरित रूप से देखने के लिए उपलब्ध होना चाहता हूं। मैं सोच रहा हूं कि ऐसा करने का एक आसान तरीका क्या होगा। मैंने निम्नलिखित पर विचार किया लेकिन यह सुनिश्चित नहीं किया कि डिक्शनरी के दौरान डिस्क को डैनिश करने का कोई तरीका है और शब्दकोश निर्माण के दौरान बहुत सारी मेमोरी का उपयोग किए बिना।* त्वरित लुक-अप के लिए दृढ़ता भंडारण के साथ बड़ा * पायथन शब्दकोश

  1. मसालेदार शब्दकोश वस्तु: यकीन नहीं करता है, तो यह मेरी समस्या के लिए एक इष्टतम समाधान
  2. NoSQL प्रकार dbases है: आदर्श जो कुछ तीसरे पक्ष के सामान के साथ साथ मुख्य मान पर कम से कम निर्भरता है बस नंबर दिए गए हैं चाहता हूँ। अगर आपको लगता है कि यह अभी भी सबसे अच्छा विकल्प है, तो मैं भी यह सुनना चाहूंगा। हो सकता है कि यह मुझे विश्वास दिलाएगा।

अगर कुछ भी स्पष्ट नहीं है तो कृपया मुझे बताएं।

धन्यवाद! -Ahihi

+15

दृढ़ता = डेटाबेस के साथ बड़ा शब्दकोश। –

+0

मैंने सुना है कि इस प्रकार की चीज़ के लिए सोफे-डीबी बहुत उपयोगी है (लेकिन इसका उपयोग कभी नहीं किया गया था ...) –

उत्तर

16

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

पायथन sqlite3 के लिए समर्थन में बनाया गया है, जो आपको डिस्क पर एक फ़ाइल द्वारा समर्थित एक आसान डेटाबेस समाधान देता है।

+0

मुझे अन्य SO प्रश्न का लिंक ढूंढना होगा जो डीएनए या किसी बड़े अनुक्रम के लिए डेटाबेस का उपयोग करता है । –

+0

ठीक है कि उपयोगी होगा – Abhi

+1

इसे कार्यान्वित किया गया और हमें जिस गति की आवश्यकता है उसके लिए ठीक काम करता है :) – Abhi

4

मुझे नहीं लगता कि आपको मसालेदार निर्देश का प्रयास करना चाहिए। मुझे पूरा यकीन है कि पाइथन हर चीज में पूरी चीज को फिसल जाएगा, जिसका मतलब है कि आपका प्रोग्राम I/O के लिए शायद आवश्यक से अधिक इंतजार करेगा।

यह समस्या है जिसकी डेटाबेस का आविष्कार किया गया था। आप "नोएसक्यूएल" सोच रहे हैं लेकिन एक एसक्यूएल डेटाबेस भी काम करेगा। आप इसके लिए SQLite का उपयोग करने में सक्षम होना चाहिए; मैंने कभी भी SQLite डेटाबेस नहीं बनाया है, लेकिन SQLite सीमाओं की इस चर्चा के अनुसार, 400 मिलियन प्रविष्टियां ठीक होनी चाहिए।

What are the performance characteristics of sqlite with very large database files?

+0

अच्छी तरह से SQL काम करेगा लेकिन एक ओवरकिल भी होगा। – LtWorf

+1

SQLite वास्तव में "ओवरकिल" नहीं है। इसीलिए कई परियोजनाओं द्वारा उपयोग किया जाने का एक कारण है। – steveha

5

किसी शक (मेरी राय में) के बिना, अगर आप इस दृढ़ रहना चाहते हैं, तो Redis एक बढ़िया विकल्प है।

  1. स्थापित redis-सर्वर
  2. प्रारंभ redis सर्वर
  3. redis अजगर pacakge स्थापित करें (पिप redis स्थापित)
  4. लाभ। अपनी आवश्यकताओं के

    key1=value1 
    key2=value2 
    etc=etc 
    

    संशोधित प्रविष्टि स्क्रिप्ट:


import redis 

ds = redis.Redis(host="localhost", port=6379) 

with open("your_text_file.txt") as fh: 
    for line in fh: 
     line = line.strip() 
     k, _, v = line.partition("=") 
     ds.set(k, v) 

से ऊपर की तरह मूल्यों की एक फाइल को मान लिया गया है।


import redis 
ds = redis.Redis(host="localhost", port=6379) 

# Do your code that needs to do look ups of keys: 
for mykey in special_key_list: 
    val = ds.get(mykey) 

मैं Redis क्यों पसंद है।

  1. विन्यास दृढ़ता विकल्पों
  2. blazingly तेजी
  3. (अन्य डेटा प्रकार) सिर्फ कुंजी/मान जोड़े की तुलना में अधिक प्रदान करता है
  4. @antrirez
+0

बस सोच रहा है कि क्या आपने अन्य की-वैल्यू स्टोर डीबी के साथ खेला है और उनके बारे में कुछ कहना है..यह – Abhi

11

सिद्धांत रूप में shelve मॉड्यूल करता है आप अपनी ज़रुरत । यह एक डेटाबेस फ़ाइल द्वारा समर्थित एक सतत शब्दकोश प्रदान करता है। कुंजी तार होनी चाहिए, लेकिन शेल्व पिकलिंग/अनपिकलिंग मूल्यों का ख्याल रखेगा। डीबी फ़ाइल का प्रकार भिन्न हो सकता है, लेकिन यह Berkeley DB हैश हो सकता है, जो एक उत्कृष्ट हल्के वजन कुंजी-मूल्य डेटाबेस है।

आपका डेटा आकार बहुत बड़ा लगता है, इसलिए आपको कुछ परीक्षण करना होगा, लेकिन शेल्व/बीडीबी शायद इसके ऊपर है।

नोट: bsddb मॉड्यूल को हटा दिया गया है। संभावित रूप से शेल्व भविष्य में बीडीबी हैश का समर्थन नहीं करेगा।

7

किसी ने डीबीएम का उल्लेख नहीं किया है। यह एक फ़ाइल की तरह खोला जाता है, एक शब्दकोश की तरह व्यवहार करता है और मानक वितरण में है।

डॉक्स http://docs.python.org/release/3.0.1/library/dbm.html

import dbm 

# Open database, creating it if necessary. 
db = dbm.open('cache', 'c') 

# Record some values 
db[b'hello'] = b'there' 
db['www.python.org'] = 'Python Website' 
db['www.cnn.com'] = 'Cable News Network' 

# Note that the keys are considered bytes now. 
assert db[b'www.python.org'] == b'Python Website' 
# Notice how the value is now in bytes. 
assert db['www.cnn.com'] == b'Cable News Network' 

# Loop through contents. Other dictionary methods 
# such as .keys(), .values() also work. 
for k, v in db.iteritems(): 
print(k, '\t', v) 

# Storing a non-string key or value will raise an exception (most 
# likely a TypeError). 
db['www.yahoo.com'] = 4 

# Close when done. 
db.close() 

मैं और अधिक विदेशी रूपों में से किसी से पहले इस कोशिश करेगा, और स्थगित का उपयोग कर से/अचार लोड हो रहा है पर स्मृति में सब कुछ खींच लेंगे।

चीयर्स

टिम

+1

पायथन के पुराने संस्करणों में यह 'anydbm' मॉड्यूल था। –

2

मैं व्यक्तिगत रूप से कुछ लाख रिकॉर्ड DB के लिए LMDB और उसके python binding का उपयोग करें। रैम से बड़े डेटाबेस के लिए भी यह बेहद तेज़ है। यह प्रक्रिया में एम्बेडेड है इसलिए कोई सर्वर की आवश्यकता नहीं है। निर्भरता पाइप का उपयोग कर प्रबंधित की जाती है।

केवल नकारात्मक पक्ष आपको डीबी के अधिकतम आकार को निर्दिष्ट करना है। एलएमडीबी इस आकार की फाइल को एमएमएपी करने जा रहा है। यदि बहुत छोटा है, तो नया डेटा डालने से एक त्रुटि बढ़ेगी। बड़े पैमाने पर, आप स्पैस फ़ाइल बनाते हैं।

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