【问题标题】:unable to run java command from cgi无法从 cgi 运行 java 命令
【发布时间】:2013-05-03 10:04:38
【问题描述】:

我有这个功能可以在 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 脚本的特权,知道如何解决这个问题吗?

【问题讨论】:

  • 运行 Tika 服务器会不会更好,因此只有一个启动成本,并让 python 将数据传输到 Tika 进行处理?
  • 谢谢,看起来是个好主意,我设法运行了服务器,但不知道实际使用它...
  • Tika Wiki上记录了它以及示例
  • 由于某种原因,我无法向服务器发送请求并如示例中所示返回某些内容,我需要按 ctrl+z 来中断

标签: java python cgi apache-tika


【解决方案1】:

您将在每个单独的 CGI 调用的内存和进程空间中加载整个 JVM 实例。那很糟。很坏。对于性能和内存使用。增加内存分配是一种不能解决真正问题的技巧。几乎不应该通过 CGI 调用核心 java 代码。

你会过得更好:

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

【讨论】:

  • 看起来不错,我认为在服务器模式下运行 tika 最好,并且我能够启动它,但是我无法使用 netcat 执行以下命令(我没有 root 权限来安装netcat): nc 127.0.0.1 12345
【解决方案2】:

尝试在 shell 命令中添加-Xmx512m-XX:MaxHeapSize=256m。让shell命令看起来像这样。

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

【讨论】:

  • XX:MaxHeapSizeXmx 控制相同的东西,您可能只想使用其中一个。
猜你喜欢
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
相关资源
最近更新 更多