10

这个问题来源于这里

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

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

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

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

所以我的问题是:

我可以禁用这些列表中所有对象l1l2引用计数吗?l3基本上使整个对象(包括元数据,如引用计数)只读,这样它在任何情况下都不会被修改(我认为,这将允许我利用写时复制)。

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

4

1 回答 1

4

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

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

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

于 2013-01-03T12:45:02.880 回答