在Python中使用不同数据集在多个核心上运行模型

时间:2017-11-07 13:51:01

标签: python multiprocessing cpu-cores

我有一个包含多个数据集的文件夹,我希望在这些数据集上运行模型,并希望在多个核心之间分配负载,以增加数据处理的总体运行时间。

我的电脑有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()

1 个答案:

答案 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()