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

Tom*_*eif 9 parallel-processing bash tesseract gnu-parallel

我有一个小的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 in `cat xlist` ; do
    for y in `cat ylist` ; do
      do_something $x $y
    done
  done) | process_output
can be written like this:

parallel do_something {1} {2} :::: xlist ylist | process_output
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法弄清楚如何应用这个.如何并行化脚本?

Ole*_*nge 7

由于您有1000个PDF文件,因此可能只需并行化PDF文件的处理,而不是在单个文件中并行处理页面.

function convert_func {
  f=$1
  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 ))\] $$.tif
      echo processing file $f, page $i
      tesseract $$.tif $$ -l ces
      cat $$.txt >> $OUTPUT
  done

  rm $$.txt
  rm $$.tif
}

export -f convert_func

parallel convert_func ::: /home/tgr/OCR/input/*.pdf
Run Code Online (Sandbox Code Playgroud)

观看介绍视频以获得快速介绍:https: //www.youtube.com/playlist?list = PL284C9FF2488BC6D1

阅读教程(man parallel_tutorial或http://www.gnu.org/software/parallel/parallel_tutorial.html).你命令行爱你.

阅读EXAMPLEs(LESS=+/EXAMPLE: man parallel).