Tom*_*eif 9 parallel-processing bash tesseract gnu-parallel
我有一个小的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 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)
不幸的是我无法弄清楚如何应用这个.如何并行化脚本?
由于您有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).
| 归档时间: |
|
| 查看次数: |
3363 次 |
| 最近记录: |