2016-11-29 41 views
0

我有一個Java程序(包括其他東西)使用輸入流從外部Python應用程序讀取。閱讀外部過程錯誤流嚴重影響性能

下面是我用讀它的代碼:

InputStreamReader isr = new InputStreamReader(p.getInputStream()), 
      isrError = new InputStreamReader(p.getErrorStream()); 

BufferedReader br = new BufferedReader(isr), brError = new BufferedReader(isrError); 
new Thread() { 
    @Override 
    public void run() { 
     try { 
      while (brError.readLine() != null); 

     } catch (Exception e) { 
     } 
    } 
}.start(); 
while ((line = br.readLine()) != null) { //line is a previously declared String 
    //do whatever with line 
} 

創建線程讀取錯誤流過,因爲Python應用程序時出現錯誤(我不能編輯它拋出的錯誤,它是第三方軟件),並且由於某種原因,如果我不讀取ErrorStream,InputStream最終會被阻塞。

有什麼辦法可以讓while (brError.readLine() != null);對性能影響較小?

現在我正在看VisualVM的性能,而Java軟件通常保持在0-5%的CPU使用率之間,這是相當不錯的,但是這個循環使用的循環的60-65%左右這個線程,這是唯一的功能是防止主循環阻塞。我需要儘可能地提高性能(這正在進入工業生產線,所以正確使用資源非常重要)。

謝謝大家。

回答

1

爲便於操作(如果您在運行時不需要內容),請在ProcessBuilder中使用redirectError(File)

ProcessBuilder pb = new ProcessBuilder("foo", "-bar"); 
pb.redirectError(new File("/tmp/errors.log")); 
pb.start(); 

如果你從while (brError.readLine() != null);越來越CPU紡紗,你應該看什麼錯誤流正在恢復。由於readLine()是一個阻塞呼叫,這意味着錯誤流正在抽出大量線路。

+0

但我真的不在乎錯誤(我可能應該在之前提到過)。我只是「讀」它們,以便它們不會阻塞實際的InputStream,但我根本不關心錯誤。 – Tuzane

+0

@Mayuso然後重定向到'/ dev/null'? – Kayaman

+0

這實際上是有道理的,會比我目前的解決方案表現更好嗎?我想我應該試試。 – Tuzane

0

您正在將不需要的丟棄流轉換爲字符,這可能有點貴,特別是當您使用UTF-8時(取決於平臺編碼通常是錯誤的,無論如何)。

刪除Reader,使用BufferedInputStream作爲丟棄流。

但是,對於外部進程,重定向肯定會更好,因爲根本沒有Java處理。