繁体   English   中英

如何制作 multiprocessing.Pool 将接受的用于计算成对统计数据的共享二维数组?

[英]How do I make a shared 2D array that multiprocessing.Pool will accept for computing pairwise statistics?

我想创建一个二维数组,多个进程可以访问该数组以进行只读操作。 我的用例是应用一个函数,该函数从 2D 数组(代表一个matrix )中获取成对的列并根据附加参数的tuple计算量值( float64 )。 对于带有参数元组(a1, a2)的 m×n 数组X ,对函数f单个调用将类似于f(X, (a1, a2)) 在我的用例中,我希望每个进程使用(a1, a2)不同选择来计算f

到目前为止,我最有希望的线索是这个例子,但它使用一维数组。 它也将数组用于非读取目的,但在处理数组方面当时是相关的。

我试图通过将a = mp.Array('i', [0]*10)更改为a = mp.Array('i', [[0]*10]*10)来修改该示例,但我得到了以下追溯:

>>> a = mp.Array('i', [[0]*10]*10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/multiprocessing/context.py", line 141, in Array
    return Array(typecode_or_type, size_or_initializer, lock=lock,
  File "/usr/lib/python3.8/multiprocessing/sharedctypes.py", line 88, in Array
    obj = RawArray(typecode_or_type, size_or_initializer)
  File "/usr/lib/python3.8/multiprocessing/sharedctypes.py", line 67, in RawArray
    result.__init__(*size_or_initializer)
TypeError: an integer is required (got type list)

我检查了multiprocessing.Array文档(如下所示的摘录),其中包含参数size_or_initializer 该参数只能采用整数或序列,我认为[[0]*10]*10既没有给出上述回溯。

如果 size_or_initializer 是一个整数,那么它决定了数组的长度,并且数组最初会被清零。 否则,size_or_initializer 是一个用于初始化数组的序列,其长度决定了数组的长度。

所以我使用multiprocessing.Array主要负责人可能已经失败了。 如何构建一个可以访问(使用池)进行只读操作的二维数组?

显然,设置global变量可以有效地使每个进程都可以访问它,这可以通过将初始化函数传递给Poolinitializer参数来设置。 我担心将数组的副本传递给每个进程,因为它需要更多的内存。 一旦可以访问这个共享数组,就可以根据需要执行通常的NumPy操作。

这是一个构造示例,它从数组中选择变量对(被视为数据矩阵),并计算这些变量对之间的 相关性

from itertools import combinations
import numpy as np
from scipy.stats import pearsonr
from multiprocessing import Pool

X = np.random.random(100000*10).reshape((100000, 10))

def function(cols):
    result = X[:, cols]
    x,y = result[:,0], result[:,1]
    result = pearsonr(x,y)
    return result

def init():
    global X 

if __name__ == '__main__':
    with Pool(initializer=init, processes=4) as P:
        print(P.map(function, combinations(range(X.shape[1]), 2)))

此示例说明了如何并行化随机变量上的成对操作以实现可扩展性。 对于那些想要计算相关性以外的东西的人的一些建议:将scipy.stats.pearsonr替换为其他一些以两个数组作为参数的函数,此代码将为所有对执行计算该函数。 自然地,将X = np.random.random(100000*10).reshape((100000, 10))替换为适当地将数据加载到表示数据矩阵的二维数组中的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM