2012-01-05 17 views
5

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

बहुत धन्यवाद।

+4

डेटाबेस के बारे में कैसे? http://docs.python.org/library/sqlite3.html – FogleBird

+0

5 जीबी वाह, क्या मैं पूछ सकता हूं कि आप अचार का उपयोग करके डंप करने की कोशिश कर रहे हैं? – mouad

+1

आपके पास किस तरह का डेटा है? मैं एक [एचडीएफ 5] (http://www.hdfgroup.org/HDF5/) डेटाफाइल – konus

उत्तर

7

बिल्कुल कोई सवाल नहीं है कि यह डेटाबेस के उपयोग से किया जाना चाहिए, बजाय अचार-डेटाबेस को इस तरह की समस्या के लिए डिज़ाइन किया गया है।

यहां कुछ कोड है जो आपको प्रारंभ करने के लिए है, जो एक शब्दकोश को एक SQL डेटाबेस में डालता है और एक मान को पुनर्प्राप्त करने का एक उदाहरण दिखाता है। अपने खिलौने उदाहरण के बजाए अपने वास्तविक शब्दकोश के साथ काम करने के लिए, आपको SQL के बारे में अधिक जानने की आवश्यकता होगी, लेकिन सौभाग्य से ऑनलाइन उपलब्ध कई उत्कृष्ट संसाधन हैं। विशेष रूप से, आप सीखना चाहेंगे कि SQLAlchemy का उपयोग कैसे करें, जो एक "ऑब्जेक्ट रिलेशनल मैपर" है जो डेटाबेस के साथ काम करने के साथ सहज ज्ञान के रूप में काम कर सकता है।

import os 
import sqlite3 

# an enormous dictionary too big to be stored in pickle 
my_huge_dictionary = {"A": 1, "B": 2, "C": 3, "D": 4} 

# create a database in the file my.db 
conn = sqlite3.connect('my.db') 
c = conn.cursor() 

# Create table with two columns: k and v (for key and value). Here your key 
# is assumed to be a string of length 10 or less, and your value is assumed 
# to be an integer. I'm sure this is NOT the structure of your dictionary; 
# you'll have to read into SQL data types 
c.execute(""" 
create table dictionary (
k char[10] NOT NULL, 
v integer NOT NULL, 
PRIMARY KEY (k)) 
""") 

# dump your enormous dictionary into a database. This will take a while for 
# your large dictionary, but you should do it only once, and then in the future 
# make changes to your database rather than to a pickled file. 
for k, v in my_huge_dictionary.items(): 
    c.execute("insert into dictionary VALUES ('%s', %d)" % (k, v)) 

# retrieve a value from the database 
my_key = "A" 
c.execute("select v from dictionary where k == '%s'" % my_key) 
my_value = c.next()[0] 
print my_value 

शुभकामनाएँ!

+0

धन्यवाद बहुत डेविड, जो वास्तव में मदद करता है! – user1132834

+0

या सैनिटी को संरक्षित करने के लिए बस [sqlitedict] (https://pypi.python.org/pypi/sqlitedict) का उपयोग करें। – Radim

0

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

ZODB ज़ोप का दिल है - एक पायथन एप्लिकेशन सर्वर - जो आज अन्य अनुप्रयोगों के बीच प्लोन को शक्ति देता है।

इसे ज़ोपे के सभी उपकरणों के बिना स्टैंड-अलोन का उपयोग किया जा सकता है - आपको इसे जांचना चाहिए, दोगुना इसलिए यदि आपका डेटा SQL के लिए उपयुक्त नहीं है।

http://www.zodb.org/

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