共有メモリを作成すると、常に新しいメモリが割り当てられます(たとえば、multiprocessing
)。共有メモリオブジェクトを作成して既存のメモリを参照する方法はありますか?目的はデータ値をあらかじめ初期化するか、むしろ配列を手元に持っていれば新しい共有メモリにコピーしなくても済むようにすることです。私の経験では、大規模な共有配列を割り当てることは、値をそこにコピーするよりはるかに高速です。既存の配列の周りに共有メモリを作成する(Python)
答えて
短い答えはノーです。
私はPython拡張の著者であり、posix_ipc
1とsysv_ipc
2です。標準ライブラリの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。
- 1. 共有メモリに2D配列を作成する
- 2. 既存のAPIの周りにWeb APIラッパーを作成する
- 3. Bzr:既存のスタンドアロンリポジトリから共有リポジトリを作成する
- 4. C++ WINAPI共有メモリの動的配列
- 5. 共有メモリを持つ2D配列
- 6. Pythonプロセス間の共有メモリ
- 7. 配列の既存の配列から新しい配列を作成する
- 8. Rubyで既存の配列に2D配列を作成するには?
- 9. 既存のNumpy配列からナンディ配列を作成するには
- 10. Pythonのマルチプロセッシングと共有numpyの配列
- 11. データ配信と共有メモリ
- 12. PyOpenCLのようなテンプレートを使わずに共有メモリに配列を作成する
- 13. CUDA共有メモリ配列 - 奇妙な動作
- 14. GPUメモリにPythonで共有配列を定義していますか?
- 15. PHPの既存の配列から多次元配列を作成する
- 16. 既存の配列からオブジェクトの新しい配列を作成する
- 17. numpy配列間のPython共有ポインタ
- 18. 既存の共有オブジェクトライブラリに依存関係を追加する
- 19. Python:配列の作成は自動的にメモリを割り当てますか?
- 20. 既存の配列から日付で配列を作成する
- 21. 既存の配列からネストされた配列を作成する
- 22. CUDA共有メモリのカーネルで実行時に配列を作成する方法は?
- 23. Windows上のPythonと共有メモリのセマフォ?
- 24. CUDAプログラミング - 共有メモリ構成
- 25. 共有numpy配列を持つPythonマルチプロセッシング
- 26. 既存の共有デリゲートのオーバーライド/スウィズリングメソッド
- 27. グラフ共有軸の作成Python
- 28. 既存の2つのアクティビティに共有フローティングアクションボタンを追加する
- 29. 既存の共有フォルダの属性を更新するには?
- 30. Pythonマルチプロセッシング:共有ビット配列(bitarray 0.8.1)
ああ、あまりにも悪いですが、これはスタック対ヒープとして理にかなっています。ありがとう! –