2011-05-24 18 views
6

मुझे एक .txt फ़ाइल पढ़ने का कार्य सौंपा गया है जो विभिन्न घटनाओं का लॉग है और उन घटनाओं में से कुछ को एक शब्दकोश में लिख रहा है।पायथन शेल्व मॉड्यूल मेमोरी उपभोग

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

कोई भी स्पष्टीकरण दे सकता है कि पढ़ने/लिखने की गति और मेमोरी कितनी प्रभावित होती है ताकि मैं यह तय कर सकूं कि क्या लिखने का विकल्प उपयोग करना है या कोड दक्षता के लिए कुछ पठनीयता बलिदान देना है?

आप

+1

यह क्या आप शब्दकोश साथ क्या कर रहे निर्भर करता है लिखने की जरूरत है। यदि आप इसमें परिवर्तनीय प्रकारों को संशोधित कर रहे हैं ('शेल्फ ['कुंजी']। संलग्न करें (x)', आपको लिखने की आवश्यकता है। बेशक, आप लिखना बंद कर सकते हैं और हमेशा अपने शेल्फ में मानों को संशोधित और प्रतिस्थापित करना याद रखते हैं, अगर आप पसंद करें। –

+0

मुझे केवल कुंजी, मूल्य जोड़े जोड़ने की ज़रूरत है। लेकिन चूंकि मैं नेस्टेड शब्दकोशों के साथ काम कर रहा हूं, इसलिए मैं के, वी जोड़े को भीतरी डिक्ट्स में जोड़ दूंगा। – inspectorG4dget

+0

क्या आप इसे लिख सकते हैं ताकि आप हमेशा एक मूल्य ले सकें शेल्फ से, उस स्तर पर जो भी स्तर पर जोड़ें, और फिर उसे शेल्फ पर वापस रखें? –

उत्तर

1

धन्यवाद डेटाबेस इस आकार के लिए, को स्थगित वास्तव में गलत उपकरण है। यदि आप एक अत्यधिक उपलब्ध क्लाइंट/सर्वर वास्तुकला की जरूरत नहीं है, और तुम सिर्फ एक स्थानीय में-स्मृति-सुलभ डेटाबेस के लिए अपना TXT फ़ाइल कनवर्ट करना चाहते हैं, तो आप वास्तव में ZODB

का उपयोग कर आप कुछ की जरूरत है होना चाहिए highly- उपलब्ध है, आपको निश्चित रूप से एक औपचारिक "नोएसक्यूएल" डेटाबेस पर स्विच करने की आवश्यकता होगी, जिसमें से कई को चुनने के लिए कई विकल्प हैं।

यहां अपने शेल्व डेटाबेस को एक ZODB डेटाबेस में कनवर्ट करने का एक सरल उदाहरण है जो आपकी मेमोरी उपयोग/प्रदर्शन समस्याओं को हल करेगा। अगर आप केवल मूल्यों की जगह (`शेल्फ [ 'कुंजी'] = newvalue`) नहीं, है न करके इसे संशोधित करने की आवश्यकता:

#!/usr/bin/env python 
 
import shelve 
 
import ZODB, ZODB.FileStorage 
 
import transaction 
 
from optparse import OptionParser 
 
import os 
 
import sys 
 
import re 
 

 
reload(sys) 
 
sys.setdefaultencoding("utf-8") 
 

 
parser = OptionParser() 
 

 
parser.add_option("-o", "--output", dest = "out_file", default = False, help ="original shelve database filename") 
 
parser.add_option("-i", "--input", dest = "in_file", default = False, help ="new zodb database filename") 
 

 
parser.set_defaults() 
 
options, args = parser.parse_args() 
 

 
if options.in_file == False or options.out_file == False : 
 
    print "Need input and output database filenames" 
 
    exit(1) 
 

 
db = shelve.open(options.in_file, writeback=True) 
 
zstorage = ZODB.FileStorage.FileStorage(options.out_file) 
 
zdb = ZODB.DB(zstorage) 
 
zconnection = zdb.open() 
 
newdb = zconnection.root() 
 

 
for key, value in db.iteritems() : 
 
    print "Copying key: " + str(key) 
 
    newdb[key] = value 
 
                                                   
 
transaction.commit()

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