Python 如何确保使用配置的cpu内核进行多处理代码?
我使用Python 如何确保使用配置的cpu内核进行多处理代码?,python,multiprocessing,pool,hpc,Python,Multiprocessing,Pool,Hpc,我使用多处理池运行并行。我在HPCwith sub中首先尝试了4个内核。当它使用4个内核时,时间比1个内核减少了4倍。当我使用qstat检查时,它多次使用4个内核,但之后仅使用1个内核,代码完全相同 你能告诉我我的代码或系统有什么问题吗 import pandas as pd import numpy as np from multiprocessing import Pool from datetime import datetime t1 = pd.read_csv("template.c
多处理池
运行并行
。我在HPC
with sub中首先尝试了4个
内核。当它使用4个内核时,时间比1个内核减少了4倍。当我使用qstat
检查时,它多次使用4个内核,但之后仅使用1个内核,代码完全相同
你能告诉我我的代码或系统有什么问题吗
import pandas as pd
import numpy as np
from multiprocessing import Pool
from datetime import datetime
t1 = pd.read_csv("template.csv",header=None)
s1 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_adfr.csv")
s2 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_dock.csv")
s3 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_gemdock.csv")
s4 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_ledock.csv")
s5 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_plants.csv")
s6 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_psovina.csv")
s7 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_quickvina2.csv")
s8 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_smina.csv")
s9 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_vina.csv")
s10 = pd.read_csv("/home/donp/dude_1000_raw_raw/dude_1000_raw_raw_vinaxb.csv")
#number of core and arrays
n = 4
m = (len(t1) // n)+1
g= m*n - len(t1)
for g1 in range(g):
t1.loc[len(t1)]=0
results=[]
def block_linear(i):
temp = pd.DataFrame(np.zeros((m,29)))
for a in range(0,m):
sum_matrix = (t1.iloc[a,0]*s1) + (t1.iloc[a,1]*s2) + (t1.iloc[a,2]*s3)+ (t1.iloc[a,3]*s4) + (t1.iloc[a,4]*s5) + (t1.iloc[a,5]*s6) + (t1.iloc[a,6]*s7) + (t1.iloc[a,7]*s8) + (t1.iloc[a,8]*s9) + (t1.iloc[a,9]*s10)
rank_sum= pd.DataFrame.rank(sum_matrix,axis=0,ascending=True,method='min') #real-True
temp.iloc[a,:] = rank_sum.iloc[999].values
temp['median'] = temp.median(axis=1)
temp.index = range(i*m,(i+1)*m)
return temp
start=datetime.now()
if __name__ == '__main__':
pool = Pool(processes=n)
results = pool.map(block_linear,range(0,n))
print(datetime.now()-start)
out=pd.concat(results)
out.drop(out.tail(g).index,inplace=True)
out.to_csv('test_10dock_4core.csv',index=False)
其主要思想是将大表拆分成小表,运行计算并合并在一起。如果不更详细地使用多处理池包,则很难理解和帮助。请注意,Pool包并不保证并行化:例如,_apply函数只使用池中的一个worker,并阻止所有执行。您可以查看有关它的更多详细信息,然后单击“下一步” 但是,假设您正确地使用了库,您应该确保您的代码是完全可并行的:例如,磁盘上的I/O操作可能会限制您的并行化,从而使您的代码一次只能在一个进程中运行 我希望这有帮助
[编辑] 由于您提供了有关您的问题的更多详细信息,我可以给出更具体的提示: 首先,您的代码是零并行的。您只调用了相同的函数N次。这不是多处理的工作方式。 相反,应该平行的部分通常在for循环中,就像块_linear()中的部分一样 因此,我向您推荐: 您应该更改代码,首先计算所有加权和,然后再执行其余操作。这将对并行化有很大帮助。 因此,将此操作放在函数中:
def weighted_sum(column,df2):
temp = pd.DataFrame(np.zeros(m))
for a in range(0,m):
result = (t1.iloc[a,column]*df2)
temp.iloc[a] = result
return temp
然后,使用pool.starmap为10个数据帧并行函数,如下所示:
结果=pool.starmap(加权和,[(0,s1),(1,s2),(2,s3),…,[9,s10])
ps:pool.starmap与pool.map类似,但接受元组参数列表。你可以有更多的细节
最后但并非最不重要的一点是,你应该对你的结果进行运算,以结束你的计算。由于每列将有一个加权和,因此可以在列上应用和,然后应用秩和
这不是一个完全可运行的代码来解决您的问题,而是关于您应该如何重新构造代码以获得多处理优势的一般指南。我建议您在对所有数据运行它之前,在数据帧的子样本上测试它,以确保它工作正常。什么代码?您没有显示任何有用的内容。我已添加代码。你能看一下吗?谢谢@Jean Américo。我已经更新了代码。你能再看一下吗?