当有大量想要批量处理的文件时,并行计算(或并行处理)能够极大的提高效率。比如使用30个CPU并行计算,原本需要1个小时需要完成的任务,现在可能仅仅需要两三分钟!
很多编程语言都可以实现并行计算。
在R语言中的并行计算:
library(parallel)
my_files
my_fun
....
}
mclapply(my_files, my_fun, mc.cores = 30)#设定30个CPU并行处理
在Python中的并行计算:
import multiprocesssing
import os
my_files = os.listdir()
def my_fun(x):
.....
multiprocessing.Pool(30).map(my_fun, my_files)#设定30个CPU并行处理
在R和Python中实现并行计算是很简单的,这不是本文的重点。本文重点讨论以下在shell(Bash)中如何实现并行任务处理。
之前一直想在shell中并行任务,在网上找个一些解决方案, 比如使用 for……if 控制进程数量来实现并行处理,但是本人试了几次,总是各种bug,而且过程变得很繁琐。
不过,最近在网上找到了答案,亲测有效!
使用parallel命令。
比如,要将一个文件夹中所有的文件拷贝到另一个文件夹中:
ls | parallel cp {} ../path_to_another_folder
更复杂一点的是并行shell函数,具体实例如下。
写一个函数com_file, 把文件名相似的文件合并在一个文件中。
com_file() {
echo $1
$(paste $_* > $1".all")#合并相似文件
}
export -f com_file#导出函数,此处与R和Python不同
cat tt.txt | parallel com_file#读取tt.txt文件中的数据,注入到com_file函数中
parallel 后面可以跟参数,如-j可以控制使用CPU数量。
具体实例参见:
https://www.gnu.org/software/parallel/man.html
领取专属 10元无门槛券
私享最新 技术干货