我已经编写了一个基于python的Mulitprocessing程序来处理.csv文件。该程序打开特定文件夹中的每个.csv文件(约250个csv文件),并在每个文件中添加新行。
问题 –处理所有csv文件所需的时间比使用多处理方法的常规顺序方法要稍高。通常,多处理应该比正常的顺序处理更快。
结果 多进程所需时间:0:00:00.748690 正常时间:0:00:00.253856
您发现代码或测试方法有什么问题吗?
import multiprocessing
import csv
import datetime
import os
# Process CSV - add new row to CSV - Nomral sequential way
def process_csv_normal(param):
for p in param:
csv_file = p.get('workspace') + "\\" + p.get('file')
with open(csv_file, 'a') as csvfile:
writer = csv.writer(csvfile)
writer.writerow({'AA001', 'AL', 'arunlal@email.com'})
# Main - Normal Process
def main_normal():
# path of csv files - Local machine folder path
workspace = r"C:\Workdir\Python\csvfolder"
params = [{'workspace': workspace, 'file': file_name} for file_name in os.listdir(workspace)
if file_name.endswith('.csv')]
process_csv_normal(params)
# Process CSV - add new row to CSV
def process_csv_multiprocess(param):
csv_file = param.get('workspace') + "\\" + param.get('file')
with open(csv_file, 'a') as csvfile:
writer = csv.writer(csvfile)
writer.writerow({'AA001', 'AL', 'arunlal@email.com'})
# Main - Multi process function
def main_multiprocess():
# path of csv files - Local machine folder path
workspace = r"C:\Workdir\Python\csvfolder"
# Number of files to process at a time
process = 1
params = [{'workspace': workspace, 'file': file_name} for file_name in os.listdir(workspace)
if file_name.endswith('.csv')]
pool = multiprocessing.Pool(processes=process)
pool.map_async(process_csv_multiprocess, params)
pool.close()
pool.join()
if __name__ == '__main__':
start=datetime.datetime.now()
main_multiprocess()
print("Multiprocess Time taken: " + str(datetime.datetime.now()-start))
start = datetime.datetime.now()
main_normal()
print("Normal Time Taken: " + str(datetime.datetime.now() - start))
答案 0 :(得分:1)
打开文件,添加一行并关闭它是非常快速的操作,主要受磁盘访问限制(即,这不是占用大量CPU的操作)。磁盘访问通常是不可并行的(在HHD上,磁头必须移动到特定位置,在SSD上,您需要请求特定的块等),因此多处理将无济于事。
最重要的是,您需要考虑多处理引入的开销:产生进程池,序列化,传输和反序列化数据,协调等。所有这些都需要一定的成本,通常,这样做的好处是可以平衡在多个内核上并行运行的多个 CPU密集型任务,情况并非如此。