我想将相当大的数据结构加载到进程中,然后分叉以希望减少总内存消耗。将要os.fork
以这种方式工作还是复制 Linux (RHEL) 中的所有父进程?
即使使用 COW,CPython 也会使用引用计数并将引用计数存储在每个对象的标头中。因此,除非您不对这些数据执行任何操作,否则很快就会对相关内存进行虚假写入,这将迫使系统复制数据。将其传递给函数?这是另一个参考,一个INCREF
,写入 COW 内存。将其存储在变量或对象属性中?相同的。甚至只是查找一个方法就可以了?同上。
出于各种原因,一些内置数据结构将其大部分数据与对象(例如大多数集合)分开分配。如果这些最终出现在不同的页面上——或者无论 COW 工作的粒度如何——你可能会很幸运。然而,从这样的集合引用的对象也不例外——使用它同样可以操作它的引用计数。
此外,一些数据将被共享,因为设计上没有对其进行写入(例如,本机 CPython 代码),并且您的某些对象fork
'd进程不碰may被分享(老实说我不确定;我think循环GC不会写入对象)。但 Python 代码使用的 Python 对象实际上肯定会被写入。类似的推理适用于 PyPy、Jython、IronPython 等(只是它们会摆弄对象标头中的位而不是进行引用计数),但我不能保证所有可能的配置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)