在GNU并行中同时输入两个文件类型?
问题描述:
是否可以使用gnu parallel
的一个实例同时有两个输入文件类型?在GNU并行中同时输入两个文件类型?
此长命令:
find . -name \*.pdf | parallel -j 4 --progress --eta 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/ebook -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' && time find . -name \*.pgm | parallel -j 4 --progress --eta 'tesseract {} {.} -l deu_frak && rm {.}.pgm'
一个)
- 创建用于读取每个PDF文件夹(第1输入文件类型)
- 与
Ghostscript
转换PDF到PGM图像 - 将它们移动到相应的文件夹中
- 然后它将使用tesseract执行每个pgm上的OCR(第二输入文件类型)
- 之后它将文本文件保存在各个文件夹中
- 最后删除所有的pgm图像文件。
但是,上述命令实际上由两个命令组成,它们与&&
相结合,将上述例程分成两个独立的部分。其结果是,它会:
B)
- 转换首先PDF转换PGM图像文件(吃了大量的磁盘 空间)
- 之前,它将与OCR和启动随后清除当时不需要的pgm图像文件。
这是不受欢迎的,因为它会在命令的第二部分执行之前吃掉我的所有磁盘空间!
是有可能这两个命令结合一体,使parallel
会经历的整个过程)的前四个PDF文件(如parallel
做4个作业的同时-j 4
),才去未来四年pdf文件?
然而,似乎有点像下面的小例子,是不可能的parallel
:
parallel -j 4 --progress --eta 'mkdir -p {.} && gs -sDEVICE=pgmraw -r300 -o {.}/{.}-%03d.pgm {}' && tesseract {} {.} -l deu_frak && rm {.}.pgm’ ::: *.pdf *.pgm
注意,两个输入文件扩展名::: *.pdf *.pgm
末。
我能做些什么来使parallel
按照例行程序a)?
编辑:
这是整个代码提出奥莱丹下我曾尝试:
generate_pgm() {
PDF="$1"
find . -name \*.pdf | parallel 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/ebook -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' ::: *.pdf
}
export -f generate_pgm
ocr() {
PGM="$1"
find . -name \*.pgm | parallel 'tesseract {} {.} -l deu_frak && rm {.}.pgm'
rm "$PGM"
}
export -f ocr
time parallel -j 4 --progress --eta 'generate_pgm {}; parallel --argsep ,,, ocr ,,, pgm/*.pgm' ::: *pdf
不幸的是,它已经成功为这个剧本基本上会做同样的我原来的脚本。它将创建所有PDF的文件夹,并开始将所有PDF转换为PGM,同时在第一个PGM图像上启动OCR,而不是在开始接下来的四个PDF之前通过每个四个PDF的全部过程。
答
我看到2个解决方案:
generate_pgm() {
PDF="$1"
# gs stuff
}
export -f generate_pgm
ocr() {
PGM="$1"
# tesseract stuff
rm "$PGM"
}
export -f ocr
parallel 'generate_pgm {}; parallel --argsep ,,, ocr ,,, pgm/*.pgm' ::: *pdf
这将彻底进入下一个前处理文件。然而,它将运行N^2个进程(N =内核数量)。为了避免使用--load
:
parallel 'generate_pgm {}; parallel --load 100% --argsep ,,, ocr ,,, pgm/*.pgm' ::: *pdf
这样,你应该只得到每个CPU核心一个主动的过程。
如果你希望它只是转换一个PDF在一个时间:
parallel -j1 'generate_pgm {}; parallel --argsep ,,, ocr ,,, pgm/*.pgm' ::: *pdf
另一个解决方案是使用dir处理器https://www.gnu.org/software/parallel/man.html#EXAMPLE:-GNU-Parallel-as-dir-processor:
nice parallel generate_pgm ::: *pdf &
inotifywait -qmre MOVED_TO -e CLOSE_WRITE --format %w%f pgm_output_dir | parallel ocr
这样的铂族金属代会并行完成。这里的风险是,如果pgm代比ocr快得多,它仍然会填满你的磁盘。
谢谢Ole Tange的回复。我用上面的写命令尝试了解决方案1。但是,脚本不会等待每个过程完成,但可以简单地将PDF转换为PGM。我忽略了什么? –
请参阅编辑一次转换1的解决方案。 –
您好Ole Tange,不幸的是脚本的编辑也不起作用。它不会超越PDF转换为PGM。没有OCR完成。另外,它告诉我'rm:pgm/*。pgm:没有这样的文件或目录'。 –