我有一个小的bash脚本来OCR PDF文件(稍微修改了这个脚本).每个文件的基本流程是:
对于pdf文件中的每个页面:
脚本:
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) 是否可以在脚本的多次运行中调用gnu parallel,而这些脚本又由gnu parallel生成?
我有一个运行100次连续迭代的python脚本,并且在每次迭代中的某个地方,并行计算4个值(使用gnu parallel).现在我想同时使用gnu parallel生成多个这样的脚本.这可能吗?gnu parallel会不会好好利用可用内核?
例如,如果在内部循环中,4个值中有2个已完成且2个正在运行,那么在计算所有4个值之前,单个脚本无法继续下一次迭代.这两个免费核心是否会用于自动计算不同脚本运行的结果?如何指定可用的核心总数?在内部呼叫并行或外部呼叫?
这个问题表明可以将调用嵌套到并行中,但是当我从脚本内部调用嵌套并行时,我不确定这是否会发生变化.
PS:Thrashing不是一个问题,我可以使用大型集群中的大量核心.
PS2:gnu-parallel是一款非常棒的工具......谢谢!:)
如何在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)
我该怎么办?
在泊坞窗文件中:
from debian:latest
RUN apt-get install parallel
RUN parallel --citation <<< "will cite"
Run Code Online (Sandbox Code Playgroud)
而docker构建根本就因为这个进入过程而没有完成。如何并联安装?
这是一个基本问题。我很好奇 xargs 和 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
如何从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) 档案下:"意外效率部门"
前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?
我正在使用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秒才能完成).我的问题是:
--jobs正确使用该选项吗?指定是否正确,-j2因为每个节点有2个CPU?或者我应该使用-jN …我一直在编译一个".c/.c ++"代码,需要1.5小时才能使用"make"命令在4核心机器上编译.我还有10台机器可以用来编译.我知道"make"中的"-j"选项,它在指定数量的线程中分配编译.但是"-j"选项仅在当前机器上分配线程,而不是在网络中连接的其他10台机器上分配线程.
我们可以使用MPI或其他并行编程技术,但我们需要根据并行编程语言重写"MAKE"命令实现.
有没有其他方法可以利用其他可用的机器进行编译?谢谢
parallel-processing makefile compilation linux-kernel gnu-parallel