2012-03-17 21 views
2

ここに問題があります。私は自分のプログラムで使わなければならない既存の.jarファイルを持っています。しかし、プログラムはPythonで書かれています。PythonからJava jarファイルを実行する最速の方法は?

私のプログラムは実行に時間がかかります(大規模な開発コーパス上で名前付きエンティティタグを使用しています)、私はcProfilerを使用してプロファイルを作成し、line_profilerを使用してプロファイルを作成しました。 92%の時間がこの作業に費やされているようです。

import subprocess as sub 
sub.call(["java", "-jar", "-Xmx512m", "MyFile.jar", 
     featuresFileName, numIterations, featureCutOff]) 

私はpopenの、その他のこまごまとした対サブプロセスについてどこかで読んますが、(のサブプロセスやOSのコールを必要としない、良い解決策を見つけることができませんでした:私は現在、次のコードを使用してい

もちろん、何もないかもしれません)。

私は、Pythonスクリプト内から.jarファイルを実行する最も速い方法についていくつかのアドバイスをいただきありがとうございます。ただし、Javaコードを変更することはできません。また、そのコードの開発者と話すためのアクセス権もありません。

また、これが役立つのか、ここではわたしが簡単に把握しているのか分かりませんが、上記のsub.call()というプロセスを何らかの形でバックグラウンドで実行する方法があります(?)のでjarファイルを呼び出すことができます。おそらくそれはスタートアップコストを削減するのに役立つでしょうか? BTW私はJavaの初心者(主にC++、C#、Pythonの経験)ですので、私の質問は全く意味をなさないでしょう - 私は事前にお詫びします...

答えて

1

これは、ほとんどの時間がこのプロセスで費やされたことを示しています。それは問題である起動時間ではないかもしれません。それが始まったら、それは何をするのかもしれない。

私が考えることができる唯一の方法は、それがオプションである場合、複数の時間を同時にバックグラウンドで実行することです。 (同時に実行するのではなく、同時に実行する)

+0

私はその方向にも進んでいました...残念なことに、私はアルゴリズムの各パスで一度それを実行しなければならず、同時実行性がないことに気が付いたときに気づきました。 – mlnyc

+2

Javaコードを変更する必要がある場合は、速くしたいと思うようです。起動時間を改善するための標準的な方法は、jarを呼び出す別のjarを追加することで可能なサービスとしてjarを実行することです。これは、あなたのサービスが常に実行されているという利点があります(スタートアップなし) –

+0

これはまさに私が質問するために私の質問を編集したものです:)まずページをリフレッシュしてください...私はそれを試してみるつもりです。私はいくつかの結果があるときに戻って...ありがとう! – mlnyc

1

"-client"オプションを指定して試してください。 JVMの起動時間を短縮するはずです。

+0

それは助けました。ありがとう! – mlnyc

0

jarファイルのマニフェストファイルを分析することによって、使用されているjarファイルのクラス名を見つけることができます。したがって、原則として、新しい引数を待ち受けている小さなJavaデーモンを作成し、適切なクラスのmain()関数を呼び出すことができます。しかし、起動コストが問題になる場合にのみ、実際にはその努力の価値があります。

3

あなたのPythonをJythonに移植して、それを同じJVM上でネイティブに実行することもできます(動作している場合と動作しない場合があります)。そうすれば、起動時間を実質的にゼロにすることができます。JVMはJITを時間をかけて活用するための十分な時間を持っています。

+0

もしそれをJythonに移植したのであれば、CPythonのCライブラリを使っている人のようにJavaのネイティブライブラリに変換し、それをPythonモジュールであるかのように呼び出すことができると思います。 –