我有一个列表dataframe_chunk
,其中包含一个非常大的pandas数据帧的块。我想将每个块写入不同的csv,并且要并行执行。但是,我看到文件是按顺序写的,我不确定为什么会这样。这是代码:
import concurrent.futures as cfu
def write_chunk_to_file(chunk, fpath):
chunk.to_csv(fpath, sep=',', header=False, index=False)
pool = cfu.ThreadPoolExecutor(N_CORES)
futures = []
for i in range(N_CORES):
fpath = '/path_to_files_'+str(i)+'.csv'
futures.append(pool.submit( write_chunk_to_file(dataframe_chunk[i], fpath)))
for f in cfu.as_completed(futures):
print("finished at ",time.time())
任何线索?
答案 0 :(得分:0)
Python 2.7.x threading
docs中陈述的一件事
但不是在3.x文档中
Python无法使用concurrent.futures
库实现真正的并行性 - 一次只能执行一个线程。
您应该尝试将multiprocessing
与ProcessPoolExecutor
一起使用,它为每个作业使用单独的进程,因此可以在多核CPU上实现真正的并行性。
<强>更新强>
以下是适合使用#!/usr/bin/env python3
from multiprocessing import Process
import os
import time
N_CORES = 8
def write_chunk_to_file(chunk, fpath):
with open(fpath, "w") as f:
for x in range(10000000):
f.write(str(x))
futures = []
print("my pid:", os.getpid())
input("Hit return to start:")
start = time.time()
print("Started at:", start)
for i in range(N_CORES):
fpath = './tmp/file-'+str(i)+'.csv'
p = Process(target=write_chunk_to_file, args=(i,fpath))
futures.append(p)
for p in futures:
p.start()
print("All jobs started.")
for p in futures:
p.join()
print("All jobs finished at ",time.time())
库的程序:
while true; do clear; pstree 12345; ls -l tmp; sleep 1; done
您可以在另一个窗口中使用此shell命令监视作业:
GRAND_MODEL | GRAND_WORKFLOW | WAIT_4_MODEL | WAIT_4_WORKFLOW
DWH_Model1 WF_workflow1 DWH_Model3 WF_Workflow3_1
DWH_Model1 WF_workflow1 DWH_Model4 WF_Workflow4_1
DWH_Model2 WF_workflow2_1 DWH_Model1 WF_Workflow1
(将12345替换为脚本发出的pid。)