2012-03-17 2 views
2

Вот моя проблема. У меня есть файл .jar, который я должен использовать в своей программе. Однако программа написана на Python.Самый быстрый способ запуска Java jar-файла из Python?

Поскольку моя программа занимает много времени для запуска (именованный объект тегов на большом корпусе разработки), я профилировал его с помощью cProfiler и выложил его профилированный с помощью line_profiler. Похоже, что 92% времени тратится на эту задачу.

В настоящее время я использую следующий код:

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

Я где-то читал о подпроцессе против Popen и других бит и кусков, но не смог найти хорошее решение, которое не требует подпроцесс или Os звонков (из конечно, их может не быть).

Мне очень понравился совет по наиболее быстрому запуску файла .jar из сценария Python. Обратите внимание, однако, что я не могу изменить код Java, и у меня нет доступа к разговору с разработчиком этого кода.

В качестве альтернативы, и я не знаю, поможет ли это, или если я просто хватаюсь за соломинку здесь, но, возможно, есть способ сохранить процесс, вызванный в sub.call() выше в фоновом режиме, так или иначе поддерживающий JVM (?), чтобы я мог просто вызвать файл jar. Может быть, это может помочь снизить затраты на запуск? BTW Я полный новичок Java (в основном, C++, C#, опыт Python), поэтому мой вопрос не имеет никакого смысла - извиняюсь заранее ...

ответ

1

Это указывает на то, что большая часть времени проводится в этом процессе. Это не может быть время запуска, которое является проблемой. Возможно, это так, как только оно началось.

Единственный способ, с помощью которого я могу думать, - запустить процесс в фоновом режиме, несколько раз одновременно, если это опция. (одновременно, а не запускать один за другим)

+0

Я тоже шел в этом направлении ... К сожалению, я должен запускать его один раз через каждый проход моего алгоритма, и когда я понял, что понял, что у меня нет шансов на параллелизм. – mlnyc

+2

Похоже, если вы захотите сделать это быстрее, вам придется изменить код Java. Стандартный способ улучшить время запуска - запустить банку как услугу, которую вы можете сделать, добавив еще одну банку, которая вызывает это. Это имеет то преимущество, что ваша служба работает все время (то есть без запуска) –

+0

Это именно то, что я только что отредактировал, чтобы задать свой вопрос :) Должен был обновить страницу сначала ... Я собираюсь попробовать, опубликую назад, когда у меня есть некоторые результаты ... Спасибо! – mlnyc

1

Попробуйте вариант «-клиент». Это должно сократить время запуска JVM.

+0

Это помогло. Благодаря! – mlnyc

0

При анализе файла манифеста файла jar вы можете узнать имя класса используемого файла jar. Итак, вы могли бы в принципе написать свой собственный маленький демон java, который слушает новые аргументы и вызывает функцию main() соответствующего класса. Но это действительно стоит усилий только в том случае, если затраты на запуск являются проблемой.

3

Вы можете попробовать перенести свой Python на Jython, а затем запустить его изначально в одной и той же JVM (что может работать или не работать). Таким образом, у вас есть фактически нулевое время запуска, и у JVM достаточно времени, чтобы использовать JIT с течением времени, чтобы в идеале дать вам лучшую производительность в целом.

+0

Если вы портировали его на Jython, я считаю, что вы можете превратить его в родную библиотеку Java, например, люди с библиотеками C в CPython, а затем вызывают его так, как если бы это был модуль Python. –

Смежные вопросы