Python 多处理仅在第一个 运行 之后才快速

Python Multiprocessing fast only after first run

我有一个脚本使用多处理打开约 200k .csv 文件并对其执行计算。工作流程如下:

1) 考虑一个包含 ~200k .csv 文件的文件夹。每个 .csv 文件包含以下内容:

.csv 文件示例:

0, 1
2, 3
4, 5
...
~500 rows

2) 该脚本将所有 .csv 文件的列表保存在 list()

3) 由于我有 8 个处理器可用,脚本将包含 ~200k .csv 文件的列表分成 8 个列表。

4) 脚本调用do_something_with_csv()8次并并行计算。

在线性模式下,执行大约需要 4 分钟。

并行和串行,如果我第一次执行脚本,需要更长的时间。如果我执行第二次、第三次等,大约需要 1 分钟。似乎 python 正在缓存某种 IO 操作?貌似是因为我有进度条,比如我执行到进度条到5k/200k就终止程序,下次执行会很快跑完前5k,然后就变慢了。

Python版本:3.6.1

伪Python代码:

def multiproc_dispatch():
        lst_of_all_csv_files = get_list_of_files('/path_to_csv_files')
        divided_lst_of_all_csv_files = split_list_chunks(lst_of_all_csv_files, 8)

        manager = Manager()
        shared_dict = manager.dict()

        jobs = []
        for lst_of_all_csv_files in divided_lst_of_all_csv_files:
            p = Process(target=do_something_with_csv, args=(shared_dict, lst_of_all_csv_files))
            jobs.append(p)
            p.start()

        # Wait for the worker to finish
        for job in jobs:
            job.join()

def read_csv_file(csv_file):
    lst_a = []
    lst_b = []
    with open(csv_file, 'r') as f_read:
        csv_reader = csv.reader(f_read, delimiter = ',')
        for row in csv_reader:
            lst_a.append(float(row[0]))
            lst_b.append(float(row[1]))
    return lst_a, lst_b


def do_something_with_csv(shared_dict, lst_of_all_csv_files):
    temp_dict = lambda: defaultdict(self.mydict)()
    for csv_file in lst_of_all_csv_files:
        lst_a, lst_b = read_csv_file(csv_file)
        temp_dict[csv_file] = (lst_a, lst_b)

    shared_dict.update(temp_dict)


if __name__ == '__main__':
    multiproc_dispatch()

这无疑是 RAM 缓存发挥作用,这意味着第二次加载文件会更快,因为数据已经在 RAM 中,而不是来自磁盘。 (努力在这里找到好的参考资料,欢迎任何帮助) 这与多处理无关,甚至与 python 本身无关。

与问题编辑无关 我认为当 运行 并行时您的代码持续时间较长的原因来自您的 shared_dict 变量从每个子进程中访问(参见 here)。在 python 中的进程之间创建和发送数据很慢,应该减少到最低限度(在这里你可以 return 每个作业一个字典然后合并它们)。