2013-04-27 219 views
2

我有這個功能來讀取在Linux上使用蒂卡一個doc文件:無法從CGI運行java命令

def read_doc(doc_path): 
    output_path=doc_path+'.txt' 
    java_path='/home/jdk1.7.0_17/jre/bin/' 
    environ = os.environ.copy() 
    environ['JAVA_HOME'] =java_path 
    environ['PATH'] =java_path 
    tika_path=java_path+'tika-app-1.3.jar' 
    shell_command='java -jar %s --text --encoding=utf-8 "%s" >"%s"'%(tika_path,doc_path,output_path) 
    proc=subprocess.Popen(shell_command,shell=True, env=environ,cwd=java_path) 
    proc.wait() 

此功能工作正常,當我在命令行中運行它,但是當我打電話同功能使用CGI,我得到以下錯誤:

Error occurred during initialization of VM Could not reserve enough space for object heap

我檢查了以前的答案對於此特定錯誤,他們建議增加內存,但是這似乎並沒有工作...我不認爲這有與內存分配有關,而是來自cgi腳本的一些讀/寫/執行權限,任何想法ho w解決這個問題?

+0

難道你不會更好地運行Tika服務器,所以只有一個啓動成本,並用python將數據傳輸到Tika進行處理? – Gagravarr 2013-04-27 18:49:30

+0

謝謝,看起來像一個好主意,我設法運行服務器,但不知道實際使用它... – hmghaly 2013-04-28 12:38:08

+0

這是記錄,以及例子,在[Tika Wiki](http://wiki.apache。 org/tika/TikaJAXRS) – Gagravarr 2013-04-28 18:04:43

回答

3

你每一個人CGI調用的內存&進程空間中加載整個JVM實例。那很糟。很壞。對於性能和內存使用。增加內存分配是一個破解不了真正問題的黑客。核心Java代碼幾乎不應該通過CGI調用。

你會更好:

  • 運行Web服務器中的一個Java servlet直接與所需的參數調用適當的蒂卡類既避免CGI和Python。將用戶url直接映射到Servlet(通過Servlet類中的@WebServlet(「someURL」)註釋)。
  • Running Tika in server mode並通過REST從Python中調用它。
  • 作爲服務器/守護程序進程單獨運行核心Java應用程序,讓它監聽TCP ServerSocket。通過客戶端套接字從Python進行調用。
+0

看起來不錯,我認爲在服務器模式下運行tika是最好的,並且我能夠啓動它,但我無法使用netcat執行以下命令(我沒有root訪問權限來安裝netcat): nc 127.0 .0.1 12345 hmghaly 2013-05-03 15:03:14

-1

嘗試將-Xmx512m-XX:MaxHeapSize=256m添加到shell命令。所以shell命令看起來像這樣。

shell_command = 'java -XX:MaxHeapSize=256m -Xmx512m -jar %s --text --encoding=utf-8 "%s" >"%s"'%(tika_path,doc_path,output_path)

+0

'XX:MaxHeapSize'和'Xmx'控制同樣的事情,你可能只想使用其中的一個。 – 2015-12-23 16:52:31