我正在尝试使用python的多处理库来希望获得一些性能。具体来说,我正在使用其map函数。现在,由于某种原因,当我将其与单个已处理的对等交换出去时,内存使用率并不高。但是使用 map 的多处理版本会使我的内存犹如屋顶。为了记录,我正在做一些很容易消耗内存的事情,但是两者之间的区别是什么呢?
最佳答案
您意识到多处理不使用线程,是吗?我之所以这样说,是因为您提到了“单线程对应对象”。
您是否通过multiprocessing
的map
发送大量数据?一个可能的原因是在许多情况下必须进行序列化多处理。 multiprocessing
使用pickle
,它通常占用比其腌制的数据更多的内存。 (在某些情况下,特别是在使用fork()
的系统上,当您调用map
方法时会创建新进程,它可以避免序列化,但是每当需要将新数据发送到现有进程时,它都无法这样做。)
由于使用multiprocessing
,所有实际工作都是在单独的进程中完成的,因此,主进程的内存不应受到执行的实际操作的影响。但是,由于每个工作进程都有您发送的数据的副本,因此内存的总使用确实增加了很多。在具有CoW的系统上,有时这是写时复制内存(在与不进行序列化相同的情况下),但是Python对内存的使用使得这种内存很快就被写入并被复制了。