假设,你遇到一份包含26万句子的数据集需要处理
而处理速度仅仅为1it/s
如果顺序执行,需要三四天的时间。
一个解决办法就是,分而治之,分成n份并行执行,处理完之后再合并。
具体流程如下:
-
生成一个包含n个命令的批处理文件,例如
可以发现,我们生成了一个批处理文件(windows:.bat,linux:.sh),每一行是一个python命令。
在windows下,用start /b command,在linux下,使用command &,使得command在后台运行,批处理文件继续开启下一个command。 -
编写批处理的python程序
例如说我们的工作是:将文件data.txt里每一行加上< end >,输出到data2.txt
with open('data.txt') as f1, open('data2.txt') as f2
data=f.readlines()
for line in data
f2.writelines(line+'<end>')
以批处理的思路改写程序:
import numpy as np
import sys
def process(path,batch)
with open('path') as f1, open('path_%d'%batch) as f2
data=f.readlines()
batch_data=np.array_split(data,8)[batch]# 利用numpy分割数据
for line in batchdata
f2.writelines(line+'<end>')
if __name__ == '__main__'
process(sys.argv[1],sys.argv[2])
- 运行批处理文件,完成后,合并得到的文件
在实际使用中,面对一开始提出的那种问题,我在四核四线程的i5-6300hq极限可开16个命令,在24核的E5上开48个命令无压力,可以说,至少数十倍地提升了处理速度。