2012-03-17 63 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]) 

我在其他地方見過子VS POPEN和其他的點點滴滴,也沒有找到,不需要子或OS調用一個很好的解決方案(中當然,可能沒有任何)。

我真的很感謝在Python腳本中運行.jar文件的最快方法。但請注意,我無法修改Java代碼,也無法與該代碼的開發人員進行交流。

另外,我不知道這是否會有所幫助,或者我只是在這裏抓住吸管,但也許有一種方法可以讓上述過程在後臺保持sub.call(),以某種方式保持JVM運行(?),以便我可以簡單地調用jar文件。也許這可以幫助降低啓動成本?順便說一句,我是一個總的Java新手(主要是C++,C#,Python的經驗),所以我的問題可能沒有任何意義 - 我提前道歉...

回答

1

這表明大部分時間都花在這個過程中。這可能不是問題的啓動時間。這可能是它一旦開始就做的。

解決這個問題的唯一辦法就是在後臺運行進程,多個時間同時進行,如果這是一個選項。 (同時而不是一個接一個地運行)

+0

我也朝着這個方向努力......不幸的是,我必須通過我的算法每次都運行一次,當我意識到我意識到我沒有併發的機會。 – mlnyc 2012-03-17 18:19:49

+2

這聽起來像是如果你想讓它更快,你將不得不改變Java代碼。提高啓動時間的標準方法是將jar作爲服務運行,您可以通過添加另一個調用此jar的jar來執行此操作。這有一個好處,就是你的服務一直在運行(即沒有啓動) – 2012-03-17 18:26:29

+0

這正是我剛纔編輯我的問題,要求:)應該先刷新頁面...我會嘗試它,將張貼當我得到一些結果時......回覆謝謝! – mlnyc 2012-03-17 18:41:38

1

嘗試使用「-client」選項。它應該減少JVM啓動時間。

+0

這有幫助。謝謝! – mlnyc 2012-03-17 18:18:47

0

通過分析jar文件的清單文件,您可以找到所使用的jar文件的類名。那麼你原則上可以編寫你自己的小Java守護進程,它監聽新的參數到達並調用相應類的main()函數。但是,只有在啓動成本是問題時才真正值得。

3

您可以嘗試將您的Python移植到Jython,然後在同一個JVM(可以或不可以)中本地運行它。通過這種方式,您可以實現零啓動時間,並且JVM有足夠的時間利用其隨時間推移的JIT,從而在理想情況下爲您提供更好的整體性能。

+0

如果你將它移植到Jython中,我相信你可以將它變成一個Java本地庫,就像人們用CPython中的C庫一樣,然後將它稱爲Python模塊。 – 2012-03-19 08:54:04