Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何确保使用配置的cpu内核进行多处理代码?_Python_Multiprocessing_Pool_Hpc - Fatal编程技术网

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。我已经更新了代码。你能再看一下吗?