我想一个相当大的数据结构加载到进程中,然后在希望叉以减少总的内存消耗。 将os.fork
工作方式或复制所有的父进程中的Linux(RHEL)?
Answer 1:
即使采用COW,CPython的使用引用计数,并存储在每个对象的标头中的引用计数。 所以,除非你不与数据做任何事情,你很快就会有误写有问题的内存,这将迫使系统复制数据。 它传递给函数? 这又是一个参考,一个INCREF
,到COW'd内存的写入。 它存储在一个变量或对象的属性? 相同。 即使只是仰望它的方法? 同上。 一些内置的数据结构从由于各种原因的对象(例如最集合)分别分配其大部分的数据。 如果这些最终会在不同的页面 - 或任何粒度COW工作在 - 你可能会得到幸运的。 然而,从这样一个集合引用的对象是不能免除的 - 用它来操纵它的refcount一样。
此外,数据位将被共享,因为有通过设计(例如,本地CPython的代码)不写它,和一些物品的fork
“d过程中不接触可共享(我真的不知道;我认为周期GC不会写入对象)。 但是,Python代码使用Python对象是几乎可以肯定获得写入。 类似的道理也适用于PyPy,Jython的,IronPython的,等等(只是他们拨弄的对象标题而不是做引用计数位),虽然我不能保证所有可能的配置。
Answer 2:
如果你是在* nix系统上,然后os.fork()
将使用系统的fork()
调用的,至少在Linux中的情况下,是写入时复制:
http://linux.die.net/man/2/fork
请参阅“注意事项”一节
文章来源: Will os.fork() use copy on write or do a full copy of the parent-process in Python?