2017-07-25 56 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:沒有這樣的文件或目錄'。 –

相關問題