13

Python を使用してテーブルを保存していますが、永続性が必要です。

基本的に、テーブルを辞書文字列として数値に保存しています。そして全体が棚で保管されています

self.DB=shelve.open("%s%sMoleculeLibrary.shelve"%(directory,os.sep),writeback=True) 

そうしないとシステムが不安定になる傾向があることがわかったので、私は慣れていますwritebackTrue

計算の後、システムはデータベースを閉じて、元に戻す必要があります。現在、データベース (テーブル) は約 540MB で、かなり時間がかかります。テーブルが約 500MB に成長した後、時間は爆発的に増加しました。しかし、もっと大きなテーブルが必要です。実際、私はそれらのうちの2つが必要です。

私はおそらく間違った形式の持続性を使用しています。パフォーマンスを向上させるにはどうすればよいですか?

4

4 に答える 4

14

キーと値のペアの大規模な辞書を格納するには、 MongoDBstring : numberなどの JSON ネイティブ ストレージ ソリューションをお勧めします。Python 用の素晴らしい API であるPymongoがあります。MongoDB 自体は軽量で信じられないほど高速であり、json オブジェクトはネイティブで Python の辞書になります。これは、キーをオブジェクト ID として使用できることを意味し、圧縮されたストレージと迅速な検索が可能になります。string

コードがいかに簡単かを示す例として、次を参照してください。

d = {'string1' : 1, 'string2' : 2, 'string3' : 3}
from pymongo import Connection
conn = Connection()
db = conn['example-database']
collection = db['example-collection']
for string, num in d.items():
    collection.save({'_id' : string, 'value' : num})
# testing
newD = {}
for obj in collection.find():
    newD[obj['_id']] = obj['value']
print newD
# output is: {u'string2': 2, u'string3': 3, u'string1': 1}

Unicode から元に戻すだけで済みますが、これは些細なことです。

于 2010-08-19T19:10:38.470 に答える
11

私の経験に基づいて、Python に付属しているSQLite3を使用することをお勧めします。大規模なデータベースとキー番号でうまく機能します。何百万ものキーとギガバイトのデータは問題ではありません。その時点でシェルフは完全に無駄になります。また、個別の db-process を使用することは有益ではありません。より多くのコンテキスト スワップが必要になるだけです。私のテストでは、より大きなデータ セットをローカルで処理する場合、SQLite3 を使用するのが好ましいオプションであることがわかりました。mongo、mysql、postgresql などのローカル データベース エンジンを実行しても、追加の価値は得られず、処理速度も遅くなります。

于 2013-03-22T18:42:43.307 に答える
1

どれくらい大きい?アクセスパターンは?その上でどのような種類の計算を行う必要がありますか?

どうやってもテーブルをメモリに保持できない場合は、パフォーマンスが制限されることに注意してください。

SQLAlchemy にアクセスしたり、 のようなものを直接使用したりすることを検討することもできますがbsddb、どちらもコードの単純さを犠牲にします。ただし、SQL を使用すると、ワークロードによっては、一部の作業をデータベース レイヤーにオフロードできる場合があります。

于 2010-08-19T19:22:49.287 に答える