我有一个 OCR PDF 文件的小 bash 脚本(稍微修改了这个脚本)。每个文件的基本流程是:
对于 pdf 文件中的每一页:
- 将页面转换为 TIFF 图像(imegamagick)
- OCR 图像(正方体)
- 猫结果到文本文件
脚本:
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
由于高分辨率和 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
不幸的是,我无法弄清楚如何应用它。如何并行化我的脚本?