2016-11-29 19 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

扱いやすいように(実行中に内容が必要ない場合)、ProcessBuilderredirectError(File)を使用してください。あなたはwhile (brError.readLine() != null);からCPUスピンを取得している場合は

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

、エラー・ストリームを返しているものを見なければなりません。 readLine()はブロッキングコールであるため、エラーストリームが多くの行をポンピングしていることを意味します。

+0

しかし、私は本当にこのエラーについては心配していません。私は実際のInputStreamをブロックしないようにそれらを "読み"ましたが、エラーはまったく気にしません。 – Tuzane

+0

@マユソそれを '/ dev/null'にリダイレクトしますか? – Kayaman

+0

実際には意味がありますが、これは私の現在のソリューションよりも優れていますか?私は試してみるべきだと思う。 – Tuzane

0

スローアウェイストリームを無駄に文字に変換しています。これは、特に、UTF-8を使用しているとき(プラットフォームのエンコードにもよりますが、通常は間違っています)には多少コストがかかる場合があります。

Readerを廃棄し、廃棄用ストリームにBufferedInputStreamを使用してください。

しかし、外部プロセスの場合、リダイレクトは確実に優れています。なぜなら、Javaでは処理が全くないからです。

関連する問題