![]() |
1
3
首先,让我们澄清一些误解,尽管事实证明,这并不是一开始就要探索的正确途径。 当您在python中分配内存时,当然必须从操作系统中获取内存。 然而,当您释放内存时,它很少返回到操作系统,直到您最终退出。相反,它进入一个“自由列表”,或者实际上,出于不同的目的,进入多个级别的自由列表。这意味着下次需要内存时,python已经拥有了它,并且可以立即找到它,而无需与操作系统进行对话来分配更多的内存。这通常使内存密集型程序更快。 但这也意味着,尤其是在现代64位操作系统上,通过查看活动监视器/任务管理器等来了解您是否真的存在内存压力问题几乎是无用的。
这个
但是,如果您没有看到任何实际问题您的系统不会进入交换地狱,您将不会得到任何
如果你 做 发现一个问题,那么,幸运的是,你已经在半路上解决它了。正如我在顶部提到的,在您最终退出之前,您分配的大多数内存不会返回到操作系统。但是,如果您所有的内存使用都发生在子进程中,并且这些子进程没有状态,那么您可以让它们在需要时退出并重新启动。 当然,执行soprocess拆卸和启动时间,以及必须重新启动的页面映射和缓存,以及要求操作系统重新分配内存,都会带来性能成本,等等。还有一个复杂的成本,你不能只运行一个池,让它做它的事情;你必须参与到它的事情中,让它为你再循环过程。
没有内置的支持
当然,你可以建立自己的
另一个你可能有记忆问题的原因是你的个别过程是好的,但是你有太多的过程。 事实上,这里似乎就是这样。
你创造了一个
对于每个块都调用这个函数:
因此,每一块都有4个新的进程。即使每一个都有很低的内存使用率,同时拥有数百个内存也会增加内存使用率。 更不用说,数百个进程在4核上竞争,可能会严重损害您的时间性能,因此您将时间浪费在上下文切换和操作系统调度上,而不是实际工作上。
正如您在评论中指出的,解决这个问题的方法是微不足道的:只需使一个全局
很抱歉,在这里获取了所有的Columbo,但此代码在模块的顶层运行的还有一件事:
而这就是试图加速池和所有子任务的代码。但是池中的每个子进程都需要
您可能在Linux或MacOS上运行这个程序,默认情况下
|
![]() |
Jamie M · 组合来自多个进程的数据 2 年前 |
![]() |
Dinesh · 如果进程数超过内核数的一半,为什么性能会下降? 7 年前 |
![]() |
cooke · python多处理使用特定参数串行运行 7 年前 |
|
SSV · 如何在Java中并行处理对象列表 7 年前 |
![]() |
Vingtoft · 使用管道的Python多进程无阻塞内部通信 7 年前 |
![]() |
cosz3 · Python多进程是否共享同一对象? 7 年前 |
![]() |
Anish Shanbhag · 多处理事件不工作 7 年前 |