Shell中的并行计算

当有大量想要批量处理的文件时,并行计算(或并行处理)能够极大的提高效率。比如使用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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180329G1Z3MM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券