此问题源自here。
我有三个包含python对象的大型列表(l1
,l2
和l3
)。这些列表是在程序启动时创建的,它们总共需要16GB的RAM。该程序将专门用于linux。
创建后,我不需要以任何方式或形式修改这些列表或这些列表中的对象。它们必须保留在内存中,直到程序退出。
我在我的程序中使用os.fork()和多处理模块来生成多个子进程(当前最多20个)。每个子流程都需要能够读取三个列表(l1
,l2
和l3
)。
我的程序运行正常并且非常快。但是我遇到内存消耗问题。由于Linux上的写时复制方法,我希望每个子进程都可以使用这三个列表而不将它们复制到内存中。但是情况并非如此,因为引用任何这些列表中的任何对象都会增加相关的引用计数,从而导致整个内存页面被复制。
所以我的问题是:
我可以停用l1
,l2
和l3
以及这些列表中的所有对象的引用计数吗?基本上将整个对象(包括诸如引用计数之类的元数据)设置为只读,以便在任何情况下都不会被修改(我认为,这将允许我利用写时复制)。 / p>
目前我担心由于目前不需要的“功能”(引用计数),我不得不转移到另一种编程语言来完成此任务,但仍然强加给我并造成不必要的问题。 / p>
答案 0 :(得分:3)
你不能,引用计数是基础到CPython(参考实现,以及你正在使用的那个)。使用对象上的方法会导致引用计数发生更改,项目订阅或属性访问会导致从堆栈中添加和删除对象,这会使用引用计数等。您无法解决此问题。
如果列表内容没有变化,请改用tuple()
。这不会改变他们将被重新计算的事实。
Python的其他实现(Jython(使用Java虚拟机),IronPython(.NET运行时语言)或PyPy(Python实现的Python,但尝试使用JIT和其他编译器技术)可以自由使用不同的内存方法管理,可能会或可能不会解决你的记忆问题。