MPI并行处理不节省时间(mpi4py)

2024-05-08 05:22:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python编写了一个脚本,在这个脚本中我必须对pandas数据帧应用一些操作,而且由于操作对于每一行都是重复的,我想节省时间,所以我使用mpi4py来并行化它。在

最初,我只是生成了一个脚本,它将数据帧分成p个部分,取第I部分并将第I个处理后的数据帧输出到一个文件中。最后,我收集每个单独的文件并将它们组合起来。问题是,尽管并行化工作得很好,但我大部分时间都在从数据帧中写入和读取数据。在

因此,我在mpi4py中查看了“更深入”的文档,找到了scatter/gather命令。作为虚拟代码,并行化脚本执行以下操作:

import pandas as pd
import numpy as np
from mpi4py import MPI

comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()

if rank == 0:
    df = pd.DataFrame({'A':5000000*[1,2,3,4,5,6,7], 'B':5000000*[1,1,1,1,1,1,1]})
    data_part = [int(x) for x in np.linspace(0, len(df), size+1)]
    dflist = [df.iloc[data_part[i]:data_part[i+1]] for i in range(size)]
else:
    dflist = None

dflist = comm.scatter(dflist, root = 0)

dflist['B'] = rank

dflist_done = comm.gather(dflist, root = 0)
if rank == 0:
    dflist_done = pd.concat(dflist_done)

当我用1、2、4、6、8和10个处理器运行代码时,所有这些处理器的计算时间都接近23秒。此外,生成的数据帧被排序,这使我认为,尽管每个处理器都是独立运行的(如果我在dflist['B'] = rank之后print(dflist)得到了部分数据帧),但是gather命令似乎存在瓶颈。在

我确信我遗漏了一些东西,但我找不到解决的办法。提前谢谢你。在


Tags: 数据import脚本dfdatasizempi4py处理器