资讯专栏INFORMATION COLUMN

GNU parallel 笔记

banana_pi / 1970人阅读

摘要:本文所有的示例在环境中有效。之前要删,记不起的循环语法时,就是一个一个的。结果,它们两个的语法我都记不住。对于比较慢的任务,在多核机器上,这是个福音。的变量与数组的传递中的变量与数组可通过传递给程序。

GNU parallel 是一个可以并行执行任务的 Shell 工具。它是一个 perl 脚本。本文所有的示例在 Bash 环境中有效。

初次尝试

以前虽然知道有这么个工具,但是一直没想到要用。今天在删除我的 Gentoo 系统的 /usr/src 目录下的旧版本的内核源码目录时用了一次,很好用。

$ cd /usr/src
$ ls ls -d linux-*
linux-4.8.10-gentoo/  linux-4.8.5-gentoo/  linux-4.8.7-gentoo/
linux-4.8.12-gentoo/  linux-4.8.6-gentoo/  linux-4.8.9-gentoo/

linux-4.8.12-gentoo 是我目前正在使用的内核版本的源码,我想只保留它,将其他的源码目录都删掉。这些源码目录中除了包含内核源码文件之外,还包含我编译时产生的中间文件,太占硬盘空间,每个源码目录差不多要用 1.2 GB 的空间。

之前要删,记不起 bash 的 for 循环语法时,就是一个一个的 rm -rf。没忘记 for 的语法时,就这样删:

$ for i in linux-4.8.{5,6,7,8,9,10}-gentoo ; do sudo rm -rf $i ; done

之所以总是忘记 bash 的 for 语法,是因为平时使用的 Shell 是 fish。fish 的 for 语法与 bash 不同。结果,它们两个的 for 语法我都记不住。

对于这种删除文件或目录的特定任务而言,更简单的做法是:

$ sudo rm -rf linux-4.8.{5,6,7,8,9,10}-gentoo

现在用 GNU parallel,就简单多了:

$ sudo parallel rm -rf ::: linux-4.8.{5,6,7,8,9,10}-gentoo

更重要的是,如果 parallel所执行的任务是并行的。对于比较慢的任务,在多核机器上,这是个福音。

如果你没东西可以删,可以试试下面这条对系统无任何危害的命令,体验一下 parallel:

$ parallel echo ::: linux-4.8.{5,6,7,8,9,10}-gentoo
并行生成 povray 动画的各帧

假设 povray 的渲染脚本为 foo.pov,动画配置文件为 foo-{1,2,3,4}.ini。并行执行 4 个 povray 进程,绘制一份被划分为四组的 30 帧画面的动画:

$ parallel povray ::: foo-{1,2,3,4}.ini
$ convert -delay 10 -loop 0 foo*.png foo.gif

可用下面的命令制作 povray 命令所需要的 4 份 .ini 文件的内容:

$ cat << EOF > foo.ini
Cyclic_Animation=on
Input_File_Name=foo.pov

Initial_Frame=1
Final_Frame=30
Initial_Clock=1
Final_Clock=0

EOF
$ seq 4 | parallel cp foo.ini foo-{}.ini
$ parallel --link "echo Subset_Start_Frame={1} | tee -a foo-{2}.ini" ::: 1 8 15 22 ::: 1 2 3 4
$ parallel --link "echo Subset_End_Frame={1} | tee -a foo-{2}.ini" ::: 7 14 21 30 ::: 1 2 3 4

测试所用的三维模型,在一台四个 CPU 核心的机器上,使用单个 povray 进程,渲染 60 帧,需要 207 秒。将这 60 帧划分为 4 组,然后用 parallel 调用 4 个 povray 进程进行渲染,只需要 92 秒。虽然并行没有预想的那样快,不过鉴于单个 povray 进程在光线跟踪运算过程中用了 2 个线程,若我的机器的 CPU 核心数能有 8 个,那么渲染时间应该能降到 50 秒左右。

并行下载及 zero 的并行化

这个只是在我们屋里有点用。

$ parallel "wget http://192.168.0.7:8080/meta-doc/agn_{}.zero" ::: array list points kd_tree bkd_tree
$ parallel "zero -m night -e "agn_{}.h, agn_{}.c" agn_{}.zero" ::: array list points kd_tree bkd_tree

避免两次载入 parallel 进程,上述两条命令可以「叠加」到一起:

$ parallel "wget http://192.168.0.7:8080/meta-doc/agn_{}.zero ; 
            zero -m night -e "agn_{}.h, agn_{}.c"  agn_{}.zero" 
            ::: array list points kd_tree bkd_tree

zero 是什么东西,这需要看「zero 的故事系列」。

shell 的变量与数组的传递

shell 中的变量与数组可通过 env_parallel 传递给 parallel 程序。例如:

$ LOCATION="http://192.168.0.7:8080/meta-doc"
$ ZERO_FILES=(array list points kd_tree bkd_tree)
$ source `which env_parallel.bash`
$ env_parallel "echo $LOCATION/agn_{}.zero" ::: ${ZERO_FILES[*]}
http://192.168.0.7:8080/meta-doc/agn_array.zero
http://192.168.0.7:8080/meta-doc/agn_list.zero
http://192.168.0.7:8080/meta-doc/agn_points.zero
http://192.168.0.7:8080/meta-doc/agn_kd_tree.zero
http://192.168.0.7:8080/meta-doc/agn_bkd_tree.zero

应该还没有完,待续……

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9682.html

相关文章

  • vulnhub DC9 靶场练习

    摘要:前言这次练习的靶机是平台下的系列靶机第台,也是最后一台。挑战该靶机的最终目的是获取权限,然后读取唯一的。这台靶机的难度为中等,其关键点是需要知道服务。发现靶机的地址为,然后用对靶机进行详细地扫描。 ...

    yangrd 评论0 收藏0
  • 《java 8 实战》读书笔记 -第七章 并行数据处理与性能

    摘要:正确使用并行流错用并行流而产生错误的首要原因,就是使用的算法改变了某些共享状态。高效使用并行流留意装箱有些操作本身在并行流上的性能就比顺序流差还要考虑流的操作流水线的总计算成本。 一、并行流 1.将顺序流转换为并行流 对顺序流调用parallel方法: public static long parallelSum(long n) { return Stream.iterate(1L...

    刘福 评论0 收藏0
  • PostgreSQL9.6:Parallel sequential scans 初体验

    摘要:一关于参数这个参数配置决定了每个并行操作允许的最大后台进程数,这个值的设置受后台进程数参数限制。查看并行顺序扫描进程备注图中可看到出现了四个进程。三测试测试之前先把的数据库关了,在确保相等情况下进行测试。 Oracle 支持强大的并行功能,创建索引,表分析,数据加载时可以开启并行,这项功能让很多数据库产品垂涎, 作为开源数据库 PostgreSQL 在并行方面也在努力尝试,很早之前 P...

    wangdai 评论0 收藏0
  • Bash Cookbook 学习笔记 【基础】

    摘要:不挂断地运行一条后台命令用运行一条后台命令时,它只是作为的一个子进程存在。当你关闭当前控制台时,会广播一个挂断信号给它的所有子进程。通过命名可以避免意外的发生。 showImg(https://segmentfault.com/img/bVZARf?w=314&h=413); Read Me 本文是以英文版 为基础整理的笔记,力求脱水 2017.11.23 更新完【基础】,内容涵盖b...

    tuomao 评论0 收藏0
  • Bash Cookbook 学习笔记 【基础】

    摘要:不挂断地运行一条后台命令用运行一条后台命令时,它只是作为的一个子进程存在。当你关闭当前控制台时,会广播一个挂断信号给它的所有子进程。通过命名可以避免意外的发生。 showImg(https://segmentfault.com/img/bVZARf?w=314&h=413); Read Me 本文是以英文版 为基础整理的笔记,力求脱水 2017.11.23 更新完【基础】,内容涵盖b...

    djfml 评论0 收藏0

发表评论

0条评论

banana_pi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<