ipython map_async输入和输出数据

时间:2012-08-28 15:09:14

标签: python map parallel-processing ipython

我是IPython并行程序包的新手,但我真的想要实现它。我有一个4D numpy数组,我想通过切片,行,列运行第四维(时间)。处理是一个最小化例程,需要花费一些时间,这就是我想要并行化的原因。

from IPython.parallel import Client
from numpy import *
from matplotlib.pylab import *

c = Client()

v = c.load_balanced_view()
v.block=False

def process( src, freq, d ):
        # Get slice, row, col
        sl,r,c = src

        # Get data
        mm = d[:,sl,c,r]

        # Call fitting routine
        <fiting routine that requires freq, mm and outputs multiple parameters> 

        return <output parameters??>


##  Create the mask of what we are going to process
mask = zeros(d[0].shape)
mask[sl][ nonzero( d[0,sl] > 10*median(d[0]) ) ] = 1

# find all non-zero points in the mask
points = array(nonzero( mask == 1)).transpose()

# Call async
asyncresult = v.map_async( process, points, freq=freq, d=d )

我的函数“process”需要两个参数:1)freq是一个numpy数组(100,1)和2)d,它是(100,50,110,110)左右。我想从拟合中检索几个参数。

我看到的所有使用map_async的例子都有简单的lambda函数等,输出似乎很简单。

我想要的是将“进程”应用于掩码不为零的d中的每个点,并将输出参数的映射应用于同一空间。 [补充:我得到“process()正好需要3个参数(给定1个)]。

(这可能是必需的第2步,因为我正在向每个进程传递一个巨大的numpy数组“d”。但是一旦我弄清楚数据传递,我希望能够找到一种更有效的方法来实现这一点。 )

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我通过

解决了数据传递问题
def mapper(x):
    return apply(x[0], x[1:])

使用元组列表调用map_async,其中第一个元素是我的函数,其余元素是我的函数的参数。

asyncResult = pool.map_async(mapper, [(func, arg1, arg2) for arg1, arg2 in myArgs])

我先尝试了一个lambda,但显然无法腌制,所以这是不行的。