Самый быстрый способ запустить файл Java JAR из Python? - PullRequest
2 голосов
/ 17 марта 2012

Вот моя проблема. У меня есть существующий файл .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. Может быть, это поможет сократить расходы на запуск? Кстати, я новичок в Java (в основном C ++, C #, опыт работы с Python), поэтому мой вопрос не имеет никакого смысла - заранее извиняюсь ...

Ответы [ 4 ]

3 голосов
/ 17 марта 2012

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

1 голос
/ 17 марта 2012

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

1 голос
/ 17 марта 2012

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

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

0 голосов
/ 17 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...