2017-07-25 54 views
1

是否可以使用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)

  1. 转换首先PDF转换PGM图像文件(吃了大量的磁盘 空间)
  2. 之前,它将与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的全部过程。

回答

1

我看到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快得多,它仍然会填满你的磁盘。

+0

谢谢Ole Tange的回复。我用上面的写命令尝试了解决方案1。但是,脚本不会等待每个过程完成,但可以简单地将PDF转换为PGM。我忽略了什么? –

+1

请参阅编辑一次转换1的解决方案。 –

+0

您好Ole Tange,不幸的是脚本的编辑也不起作用。它不会超越PDF转换为PGM。没有OCR完成。另外,它告诉我'rm:pgm/*。pgm:没有这样的文件或目录'。 –

相关问题