0

次のようなデータ構造があります。

{
    'key1':[
        [1,1,'Some text'],
        [2,0,''],
        ...
    ],
    ...
    'key99':[
        [1,1,'Some text'],
        [2,1,'More text'],
        ...
    ],
}

このサイズは、各キーに 100 個のキーと 100 個のリストのようなものです。

私はそれを保存し、キーに基づいて (リスト全体) を取得するのが好きです。これは、トラフィックがそれほど多くない Web サーバーで使用するためのものです。ただし、バックエンドは同時読み取りと書き込みを処理する必要があります。

安全な方法で、コードをあまり書かずにこれを行うにはどうすればよいでしょうか?

ピクルス化されたオブジェクトをSQLiteに保存することが可能な解決策だと思います。

より良い方法はありますか?

4

2 に答える 2

0

答えは、ボトルネックがどこにあるかによって異なります。プロセスがI/Oバウンドである場合(つまり、すべてのequestを処理するために大量のCPU時間を消費しない場合)、Twistedのようなイベント駆動型フレームワークを調べる必要があります。この場合、一度に1つのスレッドのみがデータにアクセスするため、データを通常の辞書に保存できます。

プロセスがCPUを集中的に使用し、複数のコアを利用する場合は、複数のPythonプロセスを操作する必要があります。これは、各PythonプロセスがGIL(Global Interpreter Lock)を保持し、複数のスレッドが同じプロセスでPythonコードを実行できないためです。同時に。この場合、本当に簡単なオプションは、memcachedなどの共有ストレージを使用することです。

于 2012-04-09T16:18:19.163 に答える
0

Python pickle は同時アクセス用に作成されていません。存続期間の長いプロセスを 1 つ作成できる場合は、単純にメモリ構造を操作に使用し、単一の pickle ファイルを永続化に使用できます。pickle ファイルが確実に書き込まれるようにするには、シグナルを確実にキャッチする必要があります。

より柔軟なソリューションは sqlite です。sqlite の Web ページは、「 SQLiteほど多くの同時実行性をサポートする組み込み SQL データベース エンジンは他にないことを認識しています。ここでの問題は、データベースの設計を間違っている可能性が非常に高いことです (攻撃を意図したものではありません)。リストからキーを指す外部キーを使用して、「キー」テーブルと「リスト」テーブルを作成します (より意味のある名前をお勧めします!)。キーにインデックスがあることを確認してください。

リストが固定長でない場合は、これらの値を保持する 3 番目のテーブルを作成し、外部キーがリストを指すようにする必要があります。

于 2012-04-09T16:21:14.083 に答える