我们正在编写一个内存紧张的系统。有多个python进程将导入同一组类。如果进程加载了大量的类,每个进程消耗了几百兆,那么就有10个进程,我正在进行演出。有没有办法跨python进程“共享”类导入?
要点:
import classA # Process 1 : loads classA in memory
import classA # Process 2 : reuses what was loaded previously by Process 1
PS:我想要实现的是你在C / C ++中用.so
模块做的事情。
答案 0 :(得分:2)
如果您的操作系统支持高效的写时复制分支(很多都可以),则可以节省至少一些内存。只需import
父母一次,然后fork()
创建所有孩子。
请注意,如果您有许多小对象,则不会保存任何内容,因为需要写入对象的refcounts。但是,您可以看到大型静态结构(如属性词典)可以节省大量资金。
答案 1 :(得分:1)
我不相信这在python的设计中是可能的。如果这是一个大问题,您可能希望使用线程而不是单独的进程。另外,如果你只是通过导入几个模块来运行100 Megs,那么你可能在模块中做错了(看起来有点内存可供使用)。
如果你绝对必须导入所有内容,不能减少内存使用而不能使用线程,那么将大内存代码移动到用C / C ++编写的python扩展中。这将允许您跨越进程共享python扩展所在的共享库的公共段。它也可能会减少内存占用。
P.S。在python中,你实际上是导入模块,而不是类。与C / C ++中的类似,你包括头文件,而不是类。