标签: gnu-parallel

在GNU Parallel中并行化嵌套for循环

我有一个小的bash脚本来OCR PDF文件(稍微修改了这个脚本).每个文件的基本流程是:

对于pdf文件中的每个页面:

  1. 将页面转换为TIFF图像(imegamagick)
  2. OCR图像(tesseract)
  3. 猫结果到文本文件

脚本:

FILES=/home/tgr/OCR/input/*.pdf
for f in $FILES
do

  FILENAME=$(basename "$f") 
  ENDPAGE=$(pdfinfo $f | grep "^Pages: *[0-9]\+$" | sed 's/.* //')
  OUTPUT="/home/tgr/OCR/output/${FILENAME%.*}.txt"
  RESOLUTION=1400
  touch $OUTPUT
  for i in `seq 1 $ENDPAGE`; do
      convert -monochrome -density $RESOLUTION $f\[$(($i - 1 ))\] page.tif
      echo processing file $f, page $i
      tesseract page.tif tempoutput -l ces
      cat tempoutput.txt >> $OUTPUT
  done

  rm tempoutput.txt
  rm page.tif
done
Run Code Online (Sandbox Code Playgroud)

由于高分辨率和tesseract只能使用一个核心的事实,这个过程非常慢(转换一个PDF文件大约需要3分钟).

因为我有数以千计的PDF文件,我认为我可以使用parallel所有4个核心,但我没有得到如何使用它的概念.在示例中,我看到:

Nested for-loops like this:

  (for x …
Run Code Online (Sandbox Code Playgroud)

parallel-processing bash tesseract gnu-parallel

9
推荐指数
1
解决办法
3363
查看次数

Gnu Parallel:嵌套并行

是否可以在脚本的多次运行中调用gnu parallel,而这些脚本又由gnu parallel生成?

我有一个运行100次连续迭代的python脚本,并且在每次迭代中的某个地方,并行计算4个值(使用gnu parallel).现在我想同时使用gnu parallel生成多个这样的脚本.这可能吗?gnu parallel会不会好好利用可用内核?

例如,如果在内部循环中,4个值中有2个已完成且2个正在运行,那么在计算所有4个值之前,单个脚本无法继续下一次迭代.这两个免费核心是否会用于自动计算不同脚本运行的结果?如何指定可用的核心总数?在内部呼叫并行或外部呼叫?

这个问题表明可以将调用嵌套到并行中,但是当我从脚本内部调用嵌套并行时,我不确定这是否会发生变化.

PS:Thrashing不是一个问题,我可以使用大型集群中的大量核心.

PS2:gnu-parallel是一款非常棒的工具......谢谢!:)

parallel-processing gnu-parallel

9
推荐指数
1
解决办法
1538
查看次数

Feed GNU与数组并行?

如何在GNU中与数组并行提供命令?例如,我有这个数组:

x=(0.1 0.2 0.5)
Run Code Online (Sandbox Code Playgroud)

现在我想把它喂给一些命令 parallel

parallel echo ::: $x
Run Code Online (Sandbox Code Playgroud)

这不起作用.它将所有参数提供给单个调用,因为它打印出来

0.1 0.2 0.5
Run Code Online (Sandbox Code Playgroud)

代替

0.1
0.2
0.5
Run Code Online (Sandbox Code Playgroud)

这是输出

parallel echo ::: 0.1 0.2 0.5
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

arrays bash gnu-parallel

9
推荐指数
2
解决办法
1376
查看次数

安装 GNU-Parallel:如何从 docker build 输入“will cite”?

在泊坞窗文件中:

from debian:latest

RUN apt-get install parallel
RUN parallel --citation <<< "will cite" 
Run Code Online (Sandbox Code Playgroud)

而docker构建根本就因为这个进入过程而没有完成。如何并联安装?

gnu-parallel docker

9
推荐指数
1
解决办法
2326
查看次数

并行化代码时 xargs 和 gnu parallel 有何不同?

这是一个基本问题。我很好奇 xargs 和 gnu parallel 在并行化代码时有何不同?

是否存在您会使用其中一种而不是另一种的用例?

我问这个问题是因为我已经看到了并行化问题的答案,其中使用任何一种工具都被社区认为是可以接受的。

unix xargs gnu-parallel

9
推荐指数
1
解决办法
3837
查看次数

如何向GNU Parallel提供大量命令?

我正在评估GNU Parallel是否可用于并行搜索存储在系统上的文件.系统中每年的每一天(doy)只能有一个文件(因此每年最多366个文件).假设系统上有3660个文件(大约10年的数据).该系统可以是多CPU多核Linux或多CPU Solaris.

我正在存储搜索命令以在数组中的文件上运行(每个文件一个命令).这就是我现在正在做的事情(使用bash)但是我无法控制并行启动的搜索次数(绝对不想一次启动所有3660次搜索):

#!/usr/bin/env bash
declare -a cmds
declare -i cmd_ctr=0

while [[ <condition> ]]; do
    if [[ -s $cur_archive_path/log.${doy_ctr} ]]; then
      cmds[$cmd_ctr]="<cmd_to_run>"
      let cmd_ctr++
    fi
done

declare -i arr_len=${#cmds[@]}
for (( i=0; i<${arr_len}; i++ ));
do
  # Get the command and run it in background
  eval ${cmds[$i]} &
done
wait
Run Code Online (Sandbox Code Playgroud)

如果我要使用parallel(它将自动计算最大CPU /核心并且仅并行开始这么多搜索),我如何重新cmds使用并行数组并重写上述代码?另一种方法是将所有命令写入文件,然后执行cat cmd_file | parallel

parallel-processing bash gnu-parallel

8
推荐指数
1
解决办法
4866
查看次数

将函数从zsh导出到bash以便在gnu parallel中使用

如何从zsh导出函数,以便我可以在gnu parallel中使用它?

例:

function my_func(){ echo $1;}
export -f my_func
parallel "my_func {}" :::  1 2
Run Code Online (Sandbox Code Playgroud)

在bash中输出

1
2
Run Code Online (Sandbox Code Playgroud)

而在zsh中它将输出错误消息

/bin/bash: my_func: command not found
/bin/bash: my_func: command not found
Run Code Online (Sandbox Code Playgroud)

parallel-processing bash zsh gnu-parallel

8
推荐指数
3
解决办法
2180
查看次数

为什么gnu并行分块会改善gzip的压缩大小?

档案下:"意外效率部门"

前9000万个数字约占761MB,输出为:

 seq 90000000
Run Code Online (Sandbox Code Playgroud)

根据man parallel它,它可以gzip通过切断输入并使用不同的CPU来压缩块来加速归档大文件.因此即使gzip单线程,这种技术也使它成为多线程:

seq 90000000  | parallel --pipe --recend '' -k gzip -9 >bigfile.gz
Run Code Online (Sandbox Code Playgroud)

在Intel Core i3-2330M(4)@ 2.2GHz上花了46秒.

管道到老了gzip:

seq 90000000  | gzip -9 > bigfile2.gz
Run Code Online (Sandbox Code Playgroud)

在相同的CPU上花了80秒.现在出人意料:

ls -log bigfile*.gz
Run Code Online (Sandbox Code Playgroud)

输出:

-rw-rw-r-- 1 200016306 Jul  3 17:27 bigfile.gz
-rw-rw-r-- 1 200381681 Jul  3 17:30 bigfile2.gz
Run Code Online (Sandbox Code Playgroud)

300K更大?这看起来不对.首先,我检查zdiff文件是否具有相同的内容 - 是的,相同.我认为任何压缩器在连续数据流方面都会比分块数据流做得更好.为什么不bigfile2.gz小于bigfile.gz

linux shell gzip chunking gnu-parallel

8
推荐指数
1
解决办法
465
查看次数

GNU parallel --jobs选项在群集上使用多个节点,每个节点有多个cpus

我正在使用gnu parallel在高性能(HPC)计算集群上启动代码,每个节点有2个CPU.该集群使用TORQUE便携式批处理系统(PBS).我的问题是澄清GNU并行的--jobs选项如何在这种情况下工作.

当我在没有--jobs选项的情况下运行调用GNU parallel的PBS脚本时,如下所示:

#PBS -lnodes=2:ppn=2
...
parallel --env $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \
  matlab -nodiplay -r "\"cd $PBS_O_WORKDIR,primes1({})\"" ::: 10 20 30 40
Run Code Online (Sandbox Code Playgroud)

看起来它每个核心只使用一个CPU,并且还提供以下错误流:

bash: parallel: command not found
parallel: Warning: Could not figure out number of cpus on galles087 (). Using 1.
bash: parallel: command not found
parallel: Warning: Could not figure out number of cpus on galles108 (). Using 1.
Run Code Online (Sandbox Code Playgroud)

这看起来像每个节点一个错误.我不明白第一部分(bash: parallel: command not found),但第二部分告诉我它正在使用一个节点.

当我将选项添加-j2到并行调用时,错误消失了,我认为它每个节点使用两个CPU.我仍然是HPC的新手,所以我检查这个的方法是从我的代码中输出日期时间戳(虚拟matlab代码需要10秒才能完成).我的问题是:

  1. --jobs正确使用该选项吗?指定是否正确,-j2因为每个节点有2个CPU?或者我应该使用-jN …

hpc gnu-parallel

7
推荐指数
1
解决办法
4017
查看次数

如何并行化"make"命令,可以在多台机器上分配任务

我一直在编译一个".c/.c ++"代码,需要1.5小时才能使用"make"命令在4核心机器上编译.我还有10台机器可以用来编译.我知道"make"中的"-j"选项,它在指定数量的线程中分配编译.但是"-j"选项仅在当前机器上分配线程,而不是在网络中连接的其他10台机器上分配线程.

我们可以使用MPI或其他并行编程技术,但我们需要根据并行编程语言重写"MAKE"命令实现.

有没有其他方法可以利用其他可用的机器进行编译?谢谢

parallel-processing makefile compilation linux-kernel gnu-parallel

7
推荐指数
1
解决办法
1080
查看次数