2017-02-04 27 views
0

共有メモリを作成すると、常に新しいメモリが割り当てられます(たとえば、multiprocessing)。共有メモリオブジェクトを作成して既存のメモリを参照する方法はありますか?目的はデータ値をあらかじめ初期化するか、むしろ配列を手元に持っていれば新しい共有メモリにコピーしなくても済むようにすることです。私の経験では、大規模な共有配列を割り当てることは、値をそこにコピーするよりはるかに高速です。既存の配列の周りに共有メモリを作成する(Python)

答えて

3

短い答えはノーです。

私はPython拡張の著者であり、posix_ipc1sysv_ipc2です。標準ライブラリのPythonのmultiprocessingモジュールと同様に、私のモジュールはオペレーティングシステムが提供する機能のラッパーであるため、実際に知る必要があるのは、共有メモリを割り当てるときにOSが許すものです。これは、SysV IPCとPOSIX IPCの場合と少し異なりますが、この文脈では違いはあまり重要ではありません。 (私はマルチプロセッシングが可能であればPOSIX IPCを使っていると思います)。

SysV IPCの場合、共有メモリを割り当てるためのOSレベルの呼び出しはshmget()です。その呼び出しのmanページでは、既存のメモリへのポインタを受け付けないことがわかります。常に新しいメモリを割り当てます。同一のPOSIX IPCバージョン(shm_open())の場合も同様です。 POSIX IPCは、メモリマップファイルのように共有メモリを実装しているため、SysV IPCとは少し違った動作をするため、面白いです。

にかかわらず、PythonまたはCから呼び出しているかどうかにかかわらず、オペレーティングシステムに既存のプライベートメモリの一部を共有メモリにするように要求するオプションはありません。

これについて考えると、その理由がわかります。プライベートメモリのチャンクへのポインタをshmget()またはshm_open()に渡すことができたとします。これで、オペレーティングシステムは、すべての共有プロセスが完了するまでそのメモリを保持するという仕事に悩まされています。スタックの途中にある場合はどうなりますか?突然、この大きなスタックのチャンクは他のプロセスが使用しているため割り当てできません。また、プロセスが終了すると、OSの一部が他のプロセスによって使用されているため、OSはすべてのメモリを解放できません。

つまり、基礎となるOS呼び出しでは許可されていないので、Pythonから求められているものは提供されていません。基礎となるOS呼び出しでは(おそらく) OS。

+0

ああ、あまりにも悪いですが、これはスタック対ヒープとして理にかなっています。ありがとう! –

関連する問題