2012-07-02 49 views
10

私はPythonプロセス間でメモリを共有する方法を見つけようとしています。基本的には、複数のPythonプロセスがREAD(読み込みのみ)および使用(突然変異なし)できる必要があるオブジェクトがあります。今、これはredis + strings + cPickleを使って実装されていますが、cPickleは貴重なCPU時間を要しますので、私はそれを使用する必要はありません。私がインターネット上で見たpython共有メモリの実装のほとんどは、ファイルとピクルを必要とするように見えます。これは基本的に私がすでにやっていることです。Pythonプロセス間の共有メモリ

私は、基本的にメモリ内のpythonオブジェクトデータベース/サーバーと対応するCモジュールをデータベースとインターフェースするように書く方法があると思いますか?

基本的に、Cモジュールはオブジェクトに書き込むアドレスをサーバーに要求し、サーバーはアドレスで応答し、モジュールはオブジェクトを書き込み、指定されたキーを持つオブジェクトが書き込まれたことをサーバーに通知します指定された場所のディスクにコピーします。次に、特定のキーを持つオブジェクトを取得するプロセスがあれば、指定されたキーのメモリ位置をdbに問い合わせるだけで、サーバーはその位置で応答し、モジュールはその領域をメモリにロードする方法を知り、 pythonオブジェクトをpythonプロセスに戻してください。

これは完全に不合理であるか、実際に実装するのは難しいですか?私は不可能なことを追いかけていますか?どんな提案も大歓迎です。ありがとうインターネット。

+1

あなたの提案しているものよりも同期を保つのがずっと面倒な実用的なソリューションをダンプする価値があるのは、あなたのCPU時間はどれだけ貴重ですか?あなたが求めていることはできますが、正しいことをするのは大変な痛みになります。 – millimoose

+0

CPU時間が最も貴重です。基本的に、unpicklingオブジェクトは、20 ms(小さなものの場合)〜60 ms(大きなものの場合)のいずれかを取ることができます。私は個人的には、これらの時間の両方が長すぎると感じています。 編集:私はcPickleが十分な努力をしていないと思うわけではありません。 – nickneedsaname

+0

メモリを共有することは可能ですが、共有オブジェクトは真剣に難しいでしょう...関連する質問はここにあります:http://stackoverflow.com/questions/1268252/python-possible-to-share-in-memory-data 2つの別々のプロセス間で(これはなぜ難しいのかを説明するAlex Martelliの素敵な記事があります)。 – ChristopheD

答えて

5

不合理ではありません。

IPCはメモリマップファイルで行うことができます。 Pythonは中に組み込まれた機能を持っています

http://docs.python.org/library/mmap.html

ちょうどあなたが共有ファイルを持っているプロセスとちょっと-プレストの両方でファイルをmmapさ。もちろん、両方のプロセスでそれをポーリングして、何が変更されているかを確認する必要があります。そして、あなたは両方の間で書き込みを協力しなければなりません。データを格納するフォーマットを決定します。しかし、それはあなたの問題に対する一般的な解決策です。

+6

しかしこれでもバイトにシリアル化する必要がありますか? OPは彼がそれを避けようとしていると言いました。 –

+0

これはある種のシリアライゼーションです。おそらく、オブジェクトの型がわかっているなら、カスタムのシリアル化はより良い仕事をするでしょう。あるいは、オブジェクトを2度再シリアライズするのを避けるためにハッシュコードを含めることもできます。ただし、これが行われ、シリアル化が必要です。 – Joe

+0

シリアル化がありません:( – nickneedsaname

3

酸洗いをしたくない場合は、multiprocessing.sharedctypesが適しています。しかし、それは少し低レベルです。単一の値または指定された型の配列が得られます。

子プロセスにデータを配布する別の方法(片道)はmultiprocessing.Pipeです。これはPythonオブジェクトを扱うことができ、C言語で実装されているので、酸漬けを使用するかどうかはわかりません。

関連する問題