gnu parallel_使用GNU Parallel在Linux命令行上完成更多工作

gnu parallel

您是否曾经获得过一种有趣的感觉,那就是您的计算机并没有达到应有的速度? 我曾经有这种感觉,然后我找到了GNU Parallel。

GNU Parallel是用于并行执行作业的Shell实用程序。 它可以解析多个输入,从而针对数据集同时运行脚本或命令。 您最终可以使用所有 CPU!

如果您曾经使用过xargs ,那么您已经知道如何使用Parallel。 如果您不这样做,那么本文将教您以及许多其他用例。

并行安装GNU

您的Linux或BSD计算机上可能未预安装GNU Parallel。 从您的存储库或端口集合安装它。 例如,在Fedora上:


   
   
$ sudo dnf install parallel

或在NetBSD上:


   
   
# pkg_add parallel

如果其他所有方法均失败,请参考项目主页

从串行到并行

顾名思义,Parallel的优势在于它并行运行作业,而不是像我们中许多人一样依次运行作业。

当对多个对象运行一个命令时,本质上是在创建队列。 该命令可以处理一定数量的对象,而所有其他对象只是站着等待它们的转弯。 效率低下。 给定足够的数据,总会有一个队列,但是为什么不只有一个队列,却为什么不拥有很多小队列呢?

假设您有一个文件夹,其中包含要从JPEG转换为PNG的图像。 有很多方法可以做到这一点。 有手动的方式可以在GIMP中打开每个图像并将其导出为新格式。 这通常是最糟糕的方法。 这不仅费时,而且很费力。

基于此主题的外壳程序是一个非常简洁的变体:


   
   
$ convert 001.jpeg 001.png
$ convert 002.jpeg 002.png
$ convert 003.jpeg 003.png
... and so on ...

初学时这是一个绝妙的技巧,一开始它是一个巨大的进步。 无需GUI和持续单击。 但是它仍然是劳动密集型的。

更好的是:


   
   
$ for i in *jpeg; do convert $i $i.png ; done

至少,这可以使工作动起来,并使您腾出更多精力来做更有生产力的事情。 问题是,它仍然是一个串行过程。 一幅图像被转换,然后队列中的下一幅图像逐步转换,依此类推,直到清空队列。

使用并行:


   
   
$ find . -name "*jpeg" | parallel -I% --max-args 1 convert % %.png

这是两个命令的组合: find命令(收集要操作的对象)和parallel命令(对对象进行排序,并确保按需处理所有内容)。

  • find . -name "*jpeg" find . -name "*jpeg"查找当前目录中所有以jpeg结尾的文件。
  • parallel调用GNU Parallel。
  • -I%创建了一个占位符,称为% ,以代替任何find到并行手中。 之所以使用它,是因为否则必须为find每个结果手动编写一个新命令,而这正是您要避免的事情。
  • --max-args 1限制Parallel从队列中请求新对象的速率。 由于运行Parallel的命令仅需要一个文件,因此将速率限制为1。如果您执行的是更复杂的命令,需要两个文件(例如cat 001.txt 002.txt > new.txt ),那么您将限制速率至2。
  • convert % %.png是要并行运行的命令。

该命令的结果是find收集所有相关文件并将其移交给parallel ,这将启动作业并立即请求下一个内联文件。 只要可以安全地启动新作业而不会损坏计算机,Parallel就会继续执行此操作。 旧工作完成后,它将用新工作替换,直到处理完提供给它的所有数据为止。 在使用Parallel之前,需要10分钟的时间可能只需要5或3。

多个输入

只要您熟悉findxargs (统称为GNU Find Utilities或findutils ), find命令就是通往Parallel的绝佳网关。 它提供了一个灵活的界面,许多Linux用户已经熟悉了该界面,如果您是新手,则非常容易学习。

find命令非常简单:为find提供要搜索目录的路径以及要搜索的文件名的一部分。 使用通配符将您的网络覆盖更广; 在此示例中,星号表示任何内容 ,因此find查找以字符串searchterm结尾的所有文件:


   
   
$ find /path/to/directory -name "*searchterm"

默认情况下, find返回一项搜索结果,每行一项:


   
   
$ find ~/graphics -name "*jpg"
/home/seth/graphics/001.jpg
/home/seth/graphics/cat.jpg
/home/seth/graphics/penguin.jpg
/home/seth/graphics/IMG_0135.jpg

当将find的结果通过管道传递给parallel ,每一行中的每一项都被视为parallel正在仲裁的命令的一个参数。 另一方面,如果您需要在一个命令中处理多个参数,则可以拆分将队列中的数据移交给parallel

这是一个简单的,不现实的示例,稍后我将把它变成更有用的示例。 只要安装了GNU Parallel,就可以继续执行此示例。

假设您有四个文件。 列出它们,每行列出一个,以查看您所拥有的确切信息:


   
   
$ echo ada > ada ; echo lovelace > lovelace
$ echo richard > richard ; echo stallman > stallman
$ ls -1
ada
lovelace
richard
stallman

您想将两个文件合并为一个包含两个文件内容的第三个文件。 这要求Parallel可以访问两个文件,因此-I%变量在这种情况下不起作用。

Parallel的默认行为基本上是不可见的:


   
   
$ ls -1 | parallel echo
ada
lovelace
richard
stallman

现在告诉Parallel您想为每个作业获取两个对象:


   
   
$ ls -1 | parallel --max-args=2 echo
ada lovelace
richard stallman

现在,这些行已合并。 具体来说,来自ls -1 两个结果立即全部传递给Parallel。 这是完成此任务的合适参数,但实际上,它们现在实际上是一个参数:“ ada lovelace”和“ richard stallman”。 您真正想要的是每个作业两个不同的参数。

幸运的是,这种技术性是由Parallel本身解析的。 如果将--max-args设置为2 ,则会得到两个变量{1}{2} ,分别代表参数的第一部分和第二部分:


   
   
$ ls -1 | parallel --max-args=2 cat {1} {2} ">" {1}_{2}.person

在此命令中,变量{1}是ada或richard(取决于您要看的工作),而变量{1} {2}lovelacestallman 。 这些文件的内容与在引号中的重定向符号重定向(报价从猛砸抢重定向符号使并行可以使用它),并放置到所谓的新文件ada_lovelace.personrichard_stallman.person


   
   
$ ls -1
ada
ada_lovelace.person
lovelace
richard
richard_stallman.person
stallman

$ cat ada_*person
ada lovelace
$ cat ri*person
richard stallman

如果一整天都在分析大小为数百兆字节的日志文件,那么您可能会发现并行化文本解析对您很有用; 否则,这主要是说明性练习。

但是,这种处理不仅对文本解析有重要的作用。 这是电影界的真实例子。 考虑需要结合在一起的视频文件和音频文件的目录。


   
   
$ ls -1
12_LS_establishing-manor.avi
12_wildsound.flac
14_butler-dialogue-mixed.flac
14_MS_butler.avi
...and so on...

使用相同的原理,可以创建一个简单的命令,以便将文件并行组合:


   
   
$ ls -1 | parallel --max-args=2 ffmpeg -i {1} -i {2} -vcodec copy -acodec copy {1}.mkv

蛮力 力。

所有这些花哨的输入和输出解析都不符合每个人的喜好。 如果您希望使用更直接的方法,则可以在Parallel处抛出命令然后走开。

首先,在每一行上使用一个命令创建一个文本文件:


   
   
$ cat jobs2run
bzip2 oldstuff.tar
oggenc music.flac
opusenc ambiance.wav
convert bigfile.tiff small.jpeg
ffmepg -i foo.avi -v:b 12000k foo.mp4
xsltproc --output build/tmp.fo style/dm.xsl src/tmp.xml
bzip2 archive.tar

然后将文件交给Parallel:


   
   
$ parallel --jobs 6 < jobs2run

现在,文件中的所有作业均以并行方式运行。 如果存在的作业多于允许的作业,则Parallel会形成并维护队列,直到所有作业都运行为止。

很多更多

GNU Parallel是一个功能强大且灵活的工具,用例远远超出了本文的适用范围。 它的手册页提供了您可以执行的非常酷的操作的示例,从通过SSH远程执行到将Bash函数合并到Parallel命令中。 YouTube上甚至有广泛的演示系列,因此您可以直接向GNU Parallel团队学习。 GNU Parallel首席维护人员还刚刚发布了该命令的官方指南,该指南可从Lulu.com获得

GNU Parallel可以改变您的计算方式,如果不这样做,它至少会改变您的计算机计算时间。 立即尝试!

翻译自: https://opensource.com/article/18/5/gnu-parallel

gnu parallel

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Parallel Build 是指在构建软件时,同时运行多个构建任务以加快构建速度的功能。要启用 Parallel Build,您需要了解您使用的构建系统和工具。 以下是一些常见的构建系统和工具,以及如何启用 Parallel Build: 1. GNU make GNU make 是一种常用的构建工具,可以在 Linux、Unix 和 Windows 等操作系统上使用。要启用 Parallel Build,可以在命令行使用 -j 或 --jobs 选项,并指定要运行的任务数。例如,要运行 4 个任务,您可以使用以下命令: ``` make -j4 ``` 2. CMake CMake 是一种跨平台的构建系统,可以生成各种不同的构建文件,例如 Makefile、Ninja、Visual Studio 等。要启用 Parallel Build,可以在 CMakeLists.txt 文件中添加以下代码: ``` # Enable parallel build if (NOT CMAKE_BUILD_PARALLEL_LEVEL) set(CMAKE_BUILD_PARALLEL_LEVEL 4) endif() ``` 这将设置并行构建级别为 4。您可以将其更改为您想要的值。 3. Visual Studio 如果您使用 Visual Studio 进行开发,则可以在项目属性中启用 Parallel Build。要这样做,请打开项目属性,选择“配置属性”>“C/C++”>“常规”,然后将“多处理器编译”选项设置为“是”。 以上是一些常见的构建系统和工具的示例。您可以查阅相关文档以了解更多详细信息。 ### 回答2: Parallel Build功能是一种同时运行多个构建任务的功能,可以加快编译项目的速度。在许多构建工具中都支持Parallel Build功能,比如Make、Maven、Gradle等。以下是介绍如何在Gradle中开启Parallel Build功能的步骤: 1. 打开项目的`build.gradle`文件。 2. 在文件中找到`android`标签,如果没有就添加一个。 3. 在`android`标签下添加以下代码片段: ```groovy android { // 其他配置... // 开启Parallel Build功能 compileOptions { incremental true maxParallelForks=4 // 设置最大并行任务数。根据CPU核心数量合理设置。 } } ``` 其中`maxParallelForks`用于指定最大并行构建任务数,根据计算机的CPU核心数量,可以合理设置该值。一般情况下,最大并行任务数不宜超过CPU核心数的2倍。 4. 保存`build.gradle`文件。 5. 在终端中运行`gradlew`命令来进行项目的构建。例如,在Windows系统中可以使用以下命令: ``` gradlew build ``` 在Linux或Mac系统中可以使用以下命令: ``` ./gradlew build ``` Gradle会根据设置开启Parallel Build功能。 需要注意的是,开启Parallel Build功能可能会增加CPU和内存的负载,建议根据计算机的实际性能和需求来适量调整最大并行任务数。此外,不是所有的构建任务都适合并行执行,如果遇到构建问题,可以尝试关闭Parallel Build功能或适度调整最大并行任务数。 ### 回答3: Parallel Build是一种构建项目时利用多个处理器核心同时进行编译的功能。通过并行构建,可以极大地缩短项目的构建时间,提高开发效率。 要开启Parallel Build功能,可以按照以下步骤进行操作: 1. 首先,确保你使用的是支持并行构建的构建工具,如Make、CMake、Gradle等。这些构建工具通常都会支持Parallel Build功能。 2. 接着,在项目的构建脚本中进行相关配置。具体的配置方式会依据所使用的构建工具而有所不同。以Make为例,可以在Makefile文件中加入以下配置: .PHONY : all all : @$(MAKE) -j$(nproc) 上述配置中,.PHONY表示定义一个伪目标,all为构建目标。-j参数后的$(nproc)表示使用系统上可用的处理器核心数进行并行构建。 3. 最后,执行构建命令。在命令行中切换到项目的根目录下,并输入构建命令即可开始并行构建。 需要注意的是,并行构建可能会增加系统资源的占用,因此在选择并行度时需要根据系统的配置和资源情况进行调整。通常建议将并行度设置为处理器核心数的两倍左右来达到较好的性能和稳定性。 通过以上步骤,你就能够成功开启Parallel Build功能,加速项目的构建过程。希望以上回答对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值