2010-12-28 12 views
6

私はPythonでいくつかの計算を行うスクリプトを持っています。このスクリプトをコンソールで実行すると、完了までに約7分かかりますが、実行するとJavaシェルには3倍の時間がかかります。私はJavaでスクリプトを実行するために、次のコードを使用します:Pythonスクリプトは、コンソールよりもJavaで3時間より長く走る理由コンソールよりもJavaシェルによる実行時間が長いですか?

this.p = Runtime.getRuntime().exec("script.py --batch", envp); 

this.input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
this.output = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
this.error = new BufferedReader(new InputStreamReader(p.getErrorStream())); 

あなたはどんな提案を持っていますか?

更新(2010年12月29日)

計算は次のようになります:

  1. のJavaは、Pythonにデータを送信します。
  2. Pythonはデータを読み取ります。
  3. Pythonは決定木を生成します---これは長い操作です。
  4. Pythonは、ツリーが準備完了であるという確認を送信します。
  5. Javaは確認を受け取ります。

その後、JavaとPythonの間に一連の通信がありますが、数秒かかるだけです。

更新(2010年12月29日)

すべてのご意見やご提案をいただき、ありがとうございます。私の前提が間違っていたことを知るには、1営業日かかった。私が使用したコードには「バグ」があり、実際にはコンソールとシェルで異なる計算が行われていました。私がそれを固定したとき、計算時間は同じでした。

概要:コンソールとJavaシェルで実行されるスクリプトの計算時間はほぼ同じです。 Java VMとIO通信を初期化するための追加時間は重要ではありません。

+2

多くのIOがありますか?それとも、CPUバインドされたプロセスですか? – marcog

+0

これはCPUバインドプロセスです。スクリプトは最初だけデータを受信しますが、これはすぐに実行されます。その後、スクリプトは非常に時間のかかる決定木を作成します。 – czuk

+0

'input'と' error'で何をやっていますか?それを投げ捨てるか、それを記憶に残すか?そして、これらのストリームに出力するプログラムの量はどれくらいですか? – rodion

答えて

2

バッファリングによって遅延が導入された場合に備えて、BufferedReadersとBufferedWritersを使用しないで同じコードを使用してみてください。私はバッファリングされた作家がどれだけ長く待っているのかは分かりませんが、少なくともそれらを削除することはあなたの問題を単純化するのに役立ちます。

関連する問題