I would like to load a rather large data structure into a process and then fork in the hope to reduce total memory consumption. Will os.fork
work that way or copy all of the parent process in Linux (RHEL)?
2 に答える
COW が採用されている場合でも、CPython は参照カウントを使用し、参照カウントを各オブジェクトのヘッダーに格納します。したがって、そのデータに対して何もしない限り、問題のメモリへの誤った書き込みがすぐに発生し、システムにデータのコピーを強制することになります。関数に渡す?これは別の参照、INCREF
COW されたメモリへの書き込みです。変数またはオブジェクト属性に格納しますか? 同じ。メソッドを調べるだけでも?同上。一部の組み込みデータ構造は、さまざまな理由から、オブジェクト (ほとんどのコレクションなど) とは別にデータの大部分を割り当てます。これらが別のページ (または COW が動作するどんな粒度でも) で終わった場合、それらで幸運になるかもしれません。ただし、そのようなコレクションから参照されるオブジェクトは除外されません。これを使用すると、refcount がまったく同じように操作されます。
さらに、設計上 (ネイティブの CPython コードなど) 書き込みが行われないため、一部のデータが共有されます。また、fork
プロセスが触れない一部のオブジェクトが共有される場合があります (正直なところ、よくわかりません。サイクル GC はオブジェクトに書き込まないと考えてください)。しかし、Python コードで使用される Python オブジェクトは、実質的に書き込まれることが保証されています。同様の理由が PyPy、Jython、IronPython などにも当てはまります (参照カウントを行うのではなく、オブジェクト ヘッダーのビットをいじっているだけです)。ただし、考えられるすべての構成を保証することはできません。
*nix システムを使用している場合は、少なくとも Linux の場合はコピー オン ライトであるos.fork()
システムの呼び出しを使用します。fork()
http://linux.die.net/man/2/fork
「注意事項」を参照