我有一个包含多个数据集的文件夹,我希望在这些数据集上运行模型,并希望在多个核心之间分配负载,以增加数据处理的总体运行时间。
我的电脑有8个核心。这是我下面的第一次尝试,它只是一个草图,但使用htop
,我可以看到只有1个核心被用于这项工作。这里有多核新手。
import pandas as pd
import multiprocessing
import os
from library_example import model_example
def worker(file_):
to_save = pd.Series()
with open(file_,'r') as f_open:
data = f_open.read()
# Run model
model_results = model_example(file_)
# Save results in DataFrame
to_save.to_csv(file_[:-4]+ "_results.csv", model_results )
file_location_ = "/home/datafiles/"
if __name__ == '__main__':
for filename in os.listdir(file_location_):
p = multiprocessing.Process(target=worker, args=(file_location_ + filename,))
p.start()
p.join()
答案 0 :(得分:2)
尝试移出p.join()
。这将等待以完成该过程,这有效地使您在启动过程(即start
)之后成为一个串行过程,然后等待每个过程(即join
) 。相反,你可以尝试这样的事情:
# construct the workers
workers = [multiprocessing.Process(target=worker, args=(file_location_ + filename,)) for filename in os.listdir(file_location_)]
# start them
for proc in workers:
proc.start()
# now we wait for them
for proc in workers:
proc.join()
(我没有尝试在你的代码中运行它,但这样的东西应该有用。)
编辑如果您想限制工作人员/流程的数量,那么我建议您只使用Pool
。您可以指定要使用的进程数,然后map(..)
这些进程的参数。例如:
# construct a pool of workers
pool = multiprocessing.Pool(6)
pool.map(worker, [file_location_ + filename for filename in os.listdir(file_location_)])
pool.close()