2

有人可以建议一种在使用 tika-python(在 Windows 上)时给 tika 更大的堆大小(1 GB 左右)的方法吗?

处理非常大的 Microsoft Word 文件时,我从 tika 收到“状态:500”错误。如果我按如下方式从 Windows 命令行运行 tika,错误就会消失:

C:>java -Xmx1G -jar tika-app-2.1.0.jar

指定最大堆大小为 1 GByte (-Xmx1G远大于默认值)。

我已经看到了其他语言的几个答案,但没有一个特定于带有 tika-python 的 Python 的答案。

我试过了:

os.environ["TIKA_JAVA_ARGS"] = "-Xmx1G"
from tika import parser as tika_parser 

和:

def main():  
    global MODEL_LIST   
    os.environ["TIKA_JAVA_ARGS"] = "-Xmx1G"
    start_time = time.time()
    ... rest of code ...

并从 Windows 命令行:

C:\<path>\findEm>set TIKA_JAVA_ARGS="-Xmx1G"
C:\<path>\findEm>python3 findEmv1.52.py

所有 3 种方法都会导致相同的错误,例如

2021-10-19 14:43:55,782 [MainThread  ] [WARNI]  Tika server returned status: 500

我认为主要问题是当我尝试更改最大堆大小时,Java tika 进程已经在运行 - 不知何故,我需要杀死它,设置最大堆大小,然后重新启动 Java tika 服务器。 如何?

4

1 回答 1

1

您对已经运行的进程的怀疑确实是正确的。在后台tika运行意味着当您的脚本启动时意味着它不会使用新标志重新启动 java 进程,这意味着没有堆增加。

至于解决这个问题,我们可以借助以下方法在 Windows 上完全用 Python 完成psutil

from typing import Optional
import psutil
from tika import tika as tika_server
from tika import parser

def get_tika_process() -> Optional[psutil.Process]:
    for process in psutil.process_iter(["name", "cmdline"]):
        if "java" in process.name():
            for part in process.cmdline():
                if "tika" in part:
                    return process

if existing_tika_process := get_tika_process():
    print("Found tika process:", existing_tika_process)
    print("Existing process args:", existing_tika_process.cmdline())
    existing_tika_process.terminate()
    terminate_result = existing_tika_process.wait(10)
    print(f"Terminated tika; exit code {terminate_result}")
else:
    print("No existing tika process found")


tika_server.TikaJavaArgs += "-Xmx1G"  # See note {1}
parsed = parser.from_file("spam.txt")
print("Tika server started")
new_tika_process = get_tika_process()
if new_tika_process:
    print("New process args:", new_tika_process.cmdline())



print(parsed["metadata"])
print(parsed["content"])

{1} 我直接追加到tika_server.TikaJavaArgs,因为环境变量在tika_server导入时会被解析。如果您延迟导入(如问题中的第一次尝试),您可以替换为设置环境变量。

结果:

(venv) PS E:\DevProjects\stack-exchange-answers\69637621> python .\main.py
No existing tika process found
2021-10-22 22:50:04,476 [MainThread  ] [WARNI]  Failed to see startup log message; retrying...
Tika server started
New process args: ['java', '-cp', 'C:\\Users\\user\\AppData\\Local\\Temp\\tika-server.jar', 'org.apache.tika.server.TikaServerCli', '--port', '9998', '--host', '0.0.0.0']
{'Content-Encoding': 'windows-1252', 'Content-Type': 'text/plain; charset=windows-1252', 'X-Parsed-By': ['org.apache.tika.parser.DefaultParser', 'org.apache.tika.parser.csv.TextAndCSVParser'], 'X-TIKA:content_handler': 'ToTextContentHandler', 'X-TIKA:embedded_depth': '0', 'X-TIKA:parse_time_millis': '54', 'resourceName': "b'spam.txt'"}
<blank lines removed>
Spam
Spam
More Spam!

(venv) PS E:\DevProjects\stack-exchange-answers\69637621> python .\main.py
Found tika process: psutil.Process(pid=11244, name='java.exe', status='running', started='22:50:04')
Existing process args: ['java', '-cp', 'C:\\Users\\user\\AppData\\Local\\Temp\\tika-server.jar', 'org.apache.tika.server.TikaServerCli', '--port', '9998', '--host', '0.0.0.0']
Terminated tika; exit code 15
2021-10-22 22:54:40,016 [MainThread  ] [WARNI]  Failed to see startup log message; retrying...
Tika server started
New process args: ['java', '-Xmx1G', '-cp', 'C:\\Users\\user\\AppData\\Local\\Temp\\tika-server.jar', 'org.apache.tika.server.TikaServerCli', '--port', '9998', '--host', '0.0.0.0']
{'Content-Encoding': 'windows-1252', 'Content-Type': 'text/plain; charset=windows-1252', 'X-Parsed-By': ['org.apache.tika.parser.DefaultParser', 'org.apache.tika.parser.csv.TextAndCSVParser'], 'X-TIKA:content_handler': 'ToTextContentHandler', 'X-TIKA:embedded_depth': '0', 'X-TIKA:parse_time_millis': '55', 'resourceName': "b'spam.txt'"}
<blank lines removed>
Spam
Spam
More Spam!

(venv) PS E:\DevProjects\stack-exchange-answers\69637621>

您绝对可以改进这一点(例如,检查您的 args 是否相同,如果它们相同则跳过终止),但这至少应该让您重新开始。

此外,您应该考虑tika.tika.killServer()在脚本末尾添加一个调用,以在完成后停止服务器。

于 2021-10-22T23:06:57.483 回答