我用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
命令似乎存在瓶颈。在
我确信我遗漏了一些东西,但我找不到解决的办法。提前谢谢你。在
目前没有回答
相关问题 更多 >
编程相关推荐