2012-01-05 15 views
5

pickle.dump()によって生成されたサイズは約5GBです。このファイルをロードするのに約半日かかり、約50GMのRAMが必要です。私の質問は、すべてをメモリにロードするのではなく、エントリごと(1度に1つずつ)に別々にアクセスしてこのファイルを読むことができるかどうか、またはそのようなファイルのデータにアクセスする方法が他にあるかどうかです。巨大なPython Pickle辞書をロードする

多くのありがとうございます。

+4

データベースについてはどうですか? http://docs.python.org/library/sqlite3.html – FogleBird

+0

5 GBのうわー、Pickleを使って何をダンプしようとしているのですか? – mouad

+1

どのような種類のデータがありますか?私は[hdf5](http://www.hdfgroup.org/HDF5/)のデータファイルで考えています – konus

答えて

7

これは、ピクルデータベースではなく、データベースを使用して行うべきであるという疑問は全くありません。このような問題のためにデータベースが設計されています。

ここでは、辞書をsqlliteデータベースに置き、値を取得する例を示します。私のおもちゃの例ではなく、実際の辞書でこれを動作させるには、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を使用してオブジェクト指向のデータベースを試すことができます.ZODBを使用します。内部的にはpickleを使用しますが、大量のデータを管理するためにあなたのアプリケーション

ZODBはPythonアプリケーションサーバーであるZopeの中心です。今日、Ploneは他のアプリケーションの中でも特に優れています。

Zopeのツールを一切使わずにスタンドアロンで使用できます。データがSQLに適合しない場合は、二重にチェックする必要があります。

http://www.zodb.org/