2011-12-12 10 views
10

状況は次のとおりです。私は大量のオブジェクトをメモリにロードする必要があります。それが2倍で読み込まれると、私のマシン上の利用可能なメモリを越えることになります(いいえ、私はメモリをアップグレードできません)。私はそれをより小さなものに分割することもできません。簡単にするために、オブジェクトが600 MBで、RAMが1 GBしかないとしましょう。私は、複数のプロセスで実行されているWebアプリケーションからこのオブジェクトを使用する必要があります。また、これらのオブジェクトがどのように生成されるのかを制御しません(サードパーティのロードバランサはそれを行います)。いくつかのマスタースレッド/プロセスで実行し、その後子プロセスを起動します。これはPOSHのようなものを使用する可能性を排除します。なぜなら、POSHは独自のカスタムフォークコールに依存しているからです。私はSQLiteメモリデータベース、mmap、posix_ipc、sysv_ipc、shmモジュールのようなものを使うこともできません。なぜならそれらはメモリ内のファイルとして動作し、このデータは私にとってオブジェクトでなければならないからです。そのうちの1つを使用して、ファイルとして読み込んでから、個々のプロセスとBAMのオブジェクトに変換しなければなりません。セカンダリコピーで読み込もうとしたため、セグメンテーションフォールトがマシンのメモリ制限を超えてしまいます。異なるプロセスで使用するためにPythonオブジェクトをメモリに保存するにはどうすればよいですか?

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

+0

「メモリ内のファイルとして機能するため」とはどういう意味ですか。共有メモリはメモリであり、ファイルではありません。そのメモリを使用して、オブジェクトを含む何かを格納することができます。これはPythonではそれほど明白ではないかもしれませんが、Cではそうです。これはPython専用のソリューションでなければならないのですか、または共有メモリ内のオブジェクトへのC/C++バインディングを介して間接的にオブジェクトにアクセスするハイブリッドPython/CまたはPython/C++ソリューションを検討しますか? –

+0

これらはメモリ内のファイルとして機能するため、たとえばhttp://docs.python.org/library/mmap.htmlを参照してください。 –

+1

Memcached for Pythonのようなものはまったく役に立ちますか? – doremi

答えて

4

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

共有メモリを探し、またはサーバー・プロセス。あなたのポストサーバプロセスを読み返した後は、あなたが望むものに近い音が聞こえます。

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

+0

"サーバプロセスマネージャは、任意のオブジェクトタイプをサポートするために共有メモリオブジェクトを使用するよりも柔軟性があります。また、1つのマネージャを異なるコンピュータ上のプロセスで共有することもできますネットワークを介して。 これは非常に興味深く、私が必要とする可能性のあるものですが、それを行う方法についての良い文書を見つけることはできません。 "python server process"を検索すると曖昧な結果になります。良い資源を知っていますか? – Brendan

+0

私の最後のコメントに応じて、実際には同じページの別のセクションにあります:http://docs.python.org/library/multiprocessing.html#multiprocessing.managers.BaseManager.connect 恐ろしいです!それは私のために完全に働くつもりです。 – Brendan

1

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

1

ありメモリにPythonオブジェクトを保存するために何らかの方法であること(および ファイル/文字列として/シリアル化されていない/漬物)と、それがどの プロセスからアクセス可能である必要があります。

これは動作の仕方ではありません。 Pythonのオブジェクト参照カウントとオブジェクトの内部ポインタは、複数のプロセスにわたって意味をなさない。

データが実際のPythonオブジェクトである必要がない場合は、mmap()またはデータベースなどに格納されている生データを処理できます。

関連する問題