Python禁用某些对象的引用计数

Fab*_*aze 10 python refcounting

这个问题来自这里.

我有三个包含python对象(l1,l2l3)的大型列表.这些列表是在程序启动时创建的,它们总共需要16GB的RAM.该程序将专门用于linux.

创建后,我不需要以任何方式或形式修改这些列表或这些列表中的对象.它们必须保留在内存中,直到程序退出.

我在我的程序中使用os.fork()和多处理模块来生成多个子进程(当前最多20个).这些子流程中的每一个都需要能够读取三个列表(l1,l2l3).

我的程序在其他方面工作正常并且非常快.但是我遇到内存消耗问题.由于Linux上的写时复制方法,我希望每个子进程都可以使用这三个列表而不将它们复制到内存中.但是情况并非如此,因为引用任何这些列表中的任何对象都会增加相关的引用计数,从而导致整个内存页面被复制.

所以我的问题是:

我可以禁用引用计数l1,l2以及l3这些列表中的所有对象吗?基本上将整个对象(包括诸如引用计数之类的元数据)设置为只读,以便在任何情况下都不会被修改(我认为,这将允许我利用写入时复制).

目前我担心我被迫转移到另一种编程语言来完成这项任务,因为我目前不需要的"功能"(引用计数),但仍然强加给我并导致不必要的问题.

Mar*_*ers 4

你不能,引用计数是CPython 的基础(参考实现,以及你正在使用的)。在对象上使用方法会导致引用计数发生变化,项目订阅或属性访问会导致对象在堆栈中添加和删除,而堆栈使用引用计数等。您无法解决此问题。

如果列表的内容没有改变,则使用tuple()s 代替。但这不会改变他们将被重新计票的事实。

Python 的其他实现(Jython(使用 Java 虚拟机)、IronPython(一种 .NET 运行时语言)或 PyPy(用 Python 实现的 Python,但尝试使用 JIT 和其他编译器技术)可以自由地使用不同的内存管理方法,并且可能会也可能不会解决您的记忆问题。