我有成百上千个要在处理期间并行化的文件,但逻辑上有麻烦。
我的目标是使8个线程在一个进程上工作(由于对pandas数据帧的处理,不确定是否可能)或使8个线程分别在1个文件上工作。
下面是我的应用程序中的一些简化代码。老实说,我真的不知道它在做什么。当我运行该应用程序时,它开始遍历文件,但是当我打印文件名时,它们全都乱了。几分钟后,它的速度实际上变慢了,但仍在打印乱序的随机字段名称。看来东西被附加到输出文件中了,但我不知道它们来自哪里。
我是否需要将文件列表分块并一次获取8个文件并以这种方式处理?还是我的代码在执行此操作时是不正确的?我已经尝试过Pool和Process类,但似乎都不适用于此用例。
import os.path
from os import path
import pandas as pd
import numpy as np
import math
from multiprocessing import Pool, Manager, Process
import multiprocessing as mp
from concurrent import futures as cf
from multiprocessing.pool import ThreadPool
def apply_ref_to_ind(input_df, temp_ref_df):
final_df = pd.merge(input_df, temp_ref_df, how='outer', on='CODE')
final_df['CALC2'] = final_df['CALC1'] - temp_ref_df['CALC1']
return final_df
def worker(input_file):
"""Worker process for operating on partitioned reference data"""
temp_input = pd.read_csv(input_file, dtype=str)
code = temp_input['CODE'].unique()[0]
temp_ref_df = ref_df.loc[ref_df['CODE'] == code]
print(input_file)
return_df = apply_ref_to_ind(temp_input, temp_ref_df)
if path.exists("output_file.csv"):
return_df[final_layout].to_csv('output_file.csv', index=None)
else:
return_df[final_layout].to_csv('output_file.csv', mode='a', header=False, index=None)
if __name__ == '__main__':
file_list = ['file.csv', 'file2.csv', 'file3.csv'] # etc...
ref_df = pd.read_csv('reference.csv')
final_layout = ['ID', 'CODE', 'CALC1', 'CALC2']
pool = Pool(8) # Create a multiprocessing Pool
pool.map(worker, [file for file in file_list]) # process data_inputs iterable with pool