Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多处理池复制参数列表_Python_Python 3.x_Multiprocessing - Fatal编程技术网

Python多处理池复制参数列表

Python多处理池复制参数列表,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我使用multiprocessing.Pool对象的map方法来处理非常大(>2gb)的参数列表。根据我运行脚本时的内存使用情况,每个工作人员似乎都在制作此列表的本地副本。正因为如此,我使用的内存远远超过了我应该使用的内存,那么我应该用什么来处理这个问题呢 编辑:为插图添加代码。我有数百个细胞成像数据的视频帧,我正在使用斑点检测算法来识别它们的中心和半径。这无疑是一个令人尴尬的平行问题的例子 frames = load_frames(file_vid) with mp.Pool() as p:

我使用multiprocessing.Pool对象的map方法来处理非常大(>2gb)的参数列表。根据我运行脚本时的内存使用情况,每个工作人员似乎都在制作此列表的本地副本。正因为如此,我使用的内存远远超过了我应该使用的内存,那么我应该用什么来处理这个问题呢

编辑:为插图添加代码。我有数百个细胞成像数据的视频帧,我正在使用斑点检测算法来识别它们的中心和半径。这无疑是一个令人尴尬的平行问题的例子

frames = load_frames(file_vid)
with mp.Pool() as p:
    cells = p.map(frame_cells, frames)
with open(file_cells, "wb") as f:
    pk.dump(cells, f)

您的问题是一次加载所有帧。您应该做的是逐帧加载,并将它们输入到
imap
。这样,您的内存占用将保持较小,同时允许使用多处理

下面是一段代码,说明了这一概念:

import multiprocessing as mp
import itertools
import time

def g():
    for el in range(100):
        yield el

def square(x):
    return x*x

with mp.Pool() as pool:
    r = list(pool.imap(square, g()))

用生成视频帧的代码替换
g()
,而
square
是您的处理功能。

是的,这就是
多处理
的工作原理。它不共享状态,而是创建多个进程。共享代码这仍然需要复制每个进程中的数据。如果您只想调用
list
,那么
imap
是毫无意义的……每个进程都会得到不同的数据片段——这就是重点。您可以调用列表以获取所有结果。如果您愿意,您可以将其写入文件、上载或执行任何您想执行的操作。是的,
map
也是这样工作的,它只返回一个列表。这里的问题是,正如您所说,OP已经有了
frames=load\u frames(file\u vid)
,因此每个进程都需要一个副本(这里的情况相同,
imap
不会改变这一点)。我们不知道在这里创建类似
def g()
的东西是否可行。这是问题的关键