无法从cgi运行java命令

时间:2013-04-27 11:13:36

标签: java python cgi apache-tika

我有这个函数在linux上使用tika读取doc文件:

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调用相同的函数时,我收到以下错误:

  

VM初始化期间发生错误无法保留足够的内容   对象堆空间

我检查了此特定错误的先前答案,他们建议增加内存,但这似乎不起作用......我不认为这与内存分配有关,而是一些读/写/执行来自cgi脚本的特权,任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您正在内存中加载整个JVM实例。每个CGI调用的进程空间。那很糟。很坏。用于性能和内存使用。增加内存分配是一个无法解决实际问题的黑客攻击。几乎不应该通过CGI调用核心java代码。

你会好起来的:

  • 通过在Web服务器中运行java Servlet来避免CGI和Python,该服务器直接使用所需的参数调用相应的Tika类。将用户URL直接映射到servlet(通过Servlet类上的@WebServlet(“someURL”)注释)。
  • Running Tika in server mode并通过Python从REST调用它。
  • 作为服务器/守护程序进程单独运行核心Java应用程序,让它侦听TCP ServerSocket。通过客户端套接字从Python调用。

答案 1 :(得分:-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)