2016-07-15 51 views
0

我嘗試使用kraken註冊一些圖像。我準備了一個控制檯命令來做到這一點。 這很慢,所以我把它和gnu平行結合起來。Java啓動終端執行時失效的進程

find temp/ -name '*.tif' -or -name '*.jpg' | parallel -j4 kraken -i {} {}.html binarize segment ocr -h 

它工作正常,當我在終端中這樣做。當我在java(eclipse)中啓動它時,執行在30張圖像後停止。它不會終止。它留下了不可用的進程。我嘗試了幾個配置(更多的內存(日食和exceution),少線程),但沒有任何幫助。

有人有一個想法,以避免不必要的進程或如何再次開始執行?

回答

0

幾乎可以肯定的是,問題在於您沒有使用進程的輸出,導致其輸出緩衝區填滿,因此進程停頓。

嘗試:

String command = "find temp/ -name '*.tif' -or -name '*.jpg' | parallel -j4 kraken -i {} {}.html binarize segment ocr -h"; 
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c",command}); 
InputStream is = p.getInputStream(); 
// is.skip(Long.MAX_VALUE); Doesn't work 
while (is.read() != -1) { } // consume all process output 
p.waitFor(); 

一個完整的解決方案也將處理錯誤流。這可以通過啓動一個單獨的線程來完成,該線程從錯誤流中讀取/跳過輸入。

(或者,您可以在bash命令腳本中將輸出重定向到/dev/null)。

+0

跳過結果到一個錯誤(無效尋道),但重定向輸出到dev/null工作正常 –