python - 使用 tika-python 增加 Python 中的 tika 堆大小

标签 python apache-tika tika-python

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

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

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

-Xmx1G 指定最大堆大小为 1 GB(比默认值大得多)。

我已经看到了其他语言的几个答案,但没有一个专门针对带有 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 服务器。 如何?

最佳答案

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

要解决这个问题,我们完全可以在 psutil 的帮助下,在 Windows 上使用 Python 来完成。 :

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>

您绝对可以改进这一点(例如,检查您的参数是否相同,如果相同则跳过终止),但这至少应该让您再次前进。

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

关于python - 使用 tika-python 增加 Python 中的 tika 堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69637621/

相关文章:

python - 迭代 self 是一种不好的做法吗?

python - 使用机器学习进行简单的机器人控制

python - 从实例中获取模型名称

Python - 计算直方图的地球移动器距离

java - 如何使用 apache tika 阅读 pdf 书签?

Java RTF 可以导入、编辑和导出吗?

python - docker python 提卡