mpi4py:动态数据处理

时间:2014-06-14 21:21:39

标签: python dynamic mpi mpi4py

我有一个包含tickers = ['AAPL','XOM','GOOG']等股票代码的向量,在我的“传统”python程序中,我将遍历此tickers向量,选择一个代码字符串,如AAPL,导入一个包含AAPL股票返回的csv文件,使用返回作为公共函数的输入,最后生成csv文件作为输出。我有超过4000个代码,并且适用于每个代码的功能需要时间来处理。我可以访问具有mpi4py包的计算机群集,每个作业可以访问大约100个处理器。我很清楚(并且能够实现)python中的mpi example

from mpi4py import MPI

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
if rank == 0:
    data = [i for i in range(8)]
# dividing data into chunks
    chunks = [[] for _ in range(size)]
    for i, chunk in enumerate(data):
        chunks[i % size].append(chunk)
else:
    data = None
    chunks = None
data = comm.scatter(chunks, root=0)
print str(rank) + ': ' + str(data)

[cha@cluster] ~/utils> mpirun -np 3 ./mpi.py 
2: [2, 5]
0: [0, 3, 6]
1: [1, 4, 7]

因此,在这个例子中,我们有一个大小为8的数据向量,并为每个处理器(总共3个)分配相同数量的数据元素。我如何使用上面类似的例子并为每个处理器分配一个股票代码并应用每个股票代码需要运行的功能?我如何告诉python一旦处理器获得空闲,返回tickers向量并处理尚未处理的ticker

1 个答案:

答案 0 :(得分:4)

还有另一种思考方式。您有100个处理器处理4000块数据。您可以看到的一种方法是每个处理器获取一个要操作的数据块。均匀分割,每个处理器将获得40个代码进行处理。处理器1将获得0-39,处理器2将获得40-79等

以这种方式思考,您不必担心处理器完成任务时会发生什么。只需要一个循环:

block_size = len(tickers) / size # this will be 40 in your example
for i in range(block_size):
    ticker = tickers[rank * block_size + i]
    process(ticker)

def process(ticker):
    # load data
    # process data
    # output data

这有意义吗?

[编辑]
如果您想要阅读更多内容,这实际上只是row-major order索引的一种变体,这是一种访问存储在单个内存维度中的多维数据的常用方法。