約1.5GBのデータがあります。これらの情報を Python の大きな辞書に保存したいと思います。ただし、1.5GB よりもはるかに大きく、おそらく 10 倍の費用がかかります。マシンにはそれほど多くのメモリがありません。これらのデータを辞書構造に入れるために使用するメモリを減らす方法はありますか? キーと値はすべて整数です。
よろしくお願いします、
約1.5GBのデータがあります。これらの情報を Python の大きな辞書に保存したいと思います。ただし、1.5GB よりもはるかに大きく、おそらく 10 倍の費用がかかります。マシンにはそれほど多くのメモリがありません。これらのデータを辞書構造に入れるために使用するメモリを減らす方法はありますか? キーと値はすべて整数です。
よろしくお願いします、
キーと値のペアをディスクに保存し、インテリジェントな検索とインデックス作成を可能にする高速なデータベースを使用します ( sqlite
.
すべてのデータをメモリに保存する必要がないように、データベースを使用してみてください。
Berkeley Database は、キーと値のペアのみを格納するため、理想的な使用法です。データベース形式の「dict」です!
コードは次のようになります。
from bsddb3 import db
dbdict = DB()
dbdict.open("your database", None, db.DB_HASH, db.DB_CREATE)
dbdict[3]=2 #works just like a dict!
ここにバインディングがあります: Oracle Berkeley DB の Python "バインディング"
pickle オブジェクトを使用してデータを辞書に格納します。pickle を使用するには、このリンクを参照してください http://wiki.python.org/moin/UsingPickle
キーが整数の場合、キーの範囲に応じて、辞書の代わりに配列http://docs.python.org/2/library/array.htmlを使用できます。キーは配列のインデックスになります。それだけです。これは、ディクショナリを作成するよりもメモリ効率が高くなります。
すべてのデータを配列に収めるのに十分な RAM がない場合は、sqlite や Berkeley DB などを使用して、効果的に辞書をファイルに保存します。もちろん、それははるかに遅くなります。
インデックスとデータは整数であるため、データをファイルに保存し、配列であるかのようにアクセスできますが、作業中のページのみが RAM に残り、他のページはディスクに残ります。
http://docs.python.org/2/library/mmap.htmlを参照してください
mmap はバイトベースです。これは、その中のインデックスがアーキテクチャの index*sizeof(int) のようになることを意味し、1 バイトではなく sizeof(int) バイトを読み取る必要があり、構造体モジュールを使用する必要があります (http: //docs.python.org/2/library/struct.html) を使用して、それを Python 整数に変換します。
すべてのデータが RAM に収まる場合、このソリューションは配列を使用するよりも少し遅くなります。システムがページアウトを開始すると、このソリューションは通常の配列を使用するよりも高速になります。