14

状況は次のとおりです。メモリにロードする必要のある大規模なオブジェクトがあります。非常に大きいため、2回ロードすると、マシンで使用可能なメモリを超えてしまいます(いいえ、メモリをアップグレードできません)。また、それを細かく分割することもできません。簡単にするために、オブジェクトが600 MBで、RAMが1GBしかない場合を考えてみましょう。複数のプロセスで実行されているWebアプリからこのオブジェクトを使用する必要があり、それらの生成方法を制御しないため(サードパーティのロードバランサーが実行します)、オブジェクトの作成だけに頼ることはできません。いくつかのマスタースレッド/プロセスで、次に子を生成します。これにより、POSHのようなものを使用する可能性もなくなります。これは、POSHが独自のカスタムフォーク呼び出しに依存しているためです。また、SQLiteメモリデータベース、mmap、posix_ipcなどは使用できません。sysv_ipc、およびshmモジュールは、これらがメモリ内のファイルとして機能するためです。このデータは、私が使用するためのオブジェクトである必要があります。それらの1つを使用すると、ファイルとして読み取ってから、個々のプロセスとBAMでオブジェクトに変換する必要があります。セグメンテーション違反は、2番目のコピーをロードしようとしたため、マシンのメモリ制限を超えてしまいます。

Pythonオブジェクトをメモリに(ファイル/文字列/シリアル化/ピクルスとしてではなく)格納し、どのプロセスからでもアクセスできるようにするための何らかの方法が必要です。私はそれが何であるかを知らないだけです。StackOverflowとGoogle全体を見てきましたが、答えが見つからないので、誰かが私を助けてくれることを願っています。

4

3 に答える 3

5

http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes

共有メモリまたはサーバー プロセスを探します。ポストサーバープロセスを読み直した後、必要なものに近づいたように聞こえます。

http://en.wikipedia.org/wiki/Shared_memory

于 2011-12-12T02:35:42.190 に答える
2

Python オブジェクトを (ファイル/文字列/シリアル化/pickled としてではなく) メモリに保存し、どのプロセスからもアクセスできるようにする方法が必要です。

それは作品のやり方ではありません。Python オブジェクトの参照カウントとオブジェクトの内部ポインターは、複数のプロセス間では意味がありません。

データが実際の Python オブジェクトである必要がない場合は、mmap() またはデータベースなどに保存されている生データを操作してみてください。

于 2011-12-12T03:09:23.903 に答える
1

これを、各 Python スクリプトにインポートされる C モジュールとして実装します。次に、この大きなオブジェクトへのインターフェイスは、C、または C と Python の組み合わせで実装されます。

于 2011-12-12T03:08:10.423 に答える