2016-07-15 48 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工作正常 –