所以我有一个将XML文件转换为CSV的脚本,这个脚本有一个包含嵌套循环的函数,精确的是juste 2循环:
FichList = [ f for f in os.listdir(FilenamePath) ]
def SplitFichierR50 (l_FichList):
for filename in FichList:
if filename.count(".xml") ==1:
print(filename)
tree = etree.parse(FilenamePath+"/"+filename)
for mes in tree.xpath("/R50/PRM/Donnees_Releve"):
l_ID_PRM =mes.getparent()[0]
EN_TETE=mes.getparent().getparent()[0]
l_ID_FLUX = EN_TETE[0]
l_LIB_FLUX = EN_TETE[1]
.
.
.
等...直到拥有所有XML数据并将其写入CSV文件,此脚本工作正常,但我必须优化它的执行以使其更快地工作,所以我使用多处理模块将其添加到脚本:
if __name__ == '__main__':
jobs = []
for i in range(10): # I want to use 10 CPUs
p = multiprocessing.Process(target=SplitFichierR50,args=(FichList,))
jobs.append(p)
p.start()
它确实在10个CPU上执行脚本,但它对同一个文件执行相同的操作10次。
在屏幕截图中,我只使用了3个CPU,但我们可以看到它是同一个文件3次。
我想在不同的CPU上执行循环的每个迭代。
请帮助!!
答案 0 :(得分:0)
这对我来说很难独立测试,但看起来你有一个bug。首先,您的{
"firstName": "John",
"lastName": "Doe",
"phoneNumbers": "453 123-1234, 753 123-4567"
}
函数会接收列表SplitFichierR50
,但不会在函数中使用它。实际上,每个进程中的每一个都只是遍历l_FichList
中的每个文件。这就是为什么你看到这么多重复的文件处理消息。您需要在FichList
中对文件名进行分区,以便每个进程处理一组不同的文件。
例如,像这样:
FichList
确保if __name__ == '__main__':
jobs = []
num_processes = 10
step = int(math.ceil(float(len(FichList))/float(num_processes)))
for i in range(0, len(FichList), step):
p = multiprocessing.Process(target=SplitFichierR50,args=(FichList[i:i+step],))
jobs.append(p)
p.start()
并更正import math
功能以使用传入的列表。