gpt4 book ai didi

java - 使用 POI 或 Tika 提取文本,流到流,无需将整个文件加载到内存中

转载 作者:行者123 更新时间:2023-12-01 18:28:52 24 4
gpt4 key购买 nike

我正在尝试单独使用 Apache POI 和 PDFBox,或者在 Apache Tika 的上下文中,从大量 Microsoft Office 和 PDF 文件(即在某些情况下数百兆)中提取和处理纯文本。另外,我的应用程序是多线程的,因此我将同时解析许多这样的大文件。

在这种规模下,我必须以流式传输方式处理文件。在此过程中的任何一步都不能将整个文件保存在主内存中。

我看过很多通过输入流将文件加载到 Tika/POI/PDFBox 的源代码示例。我见过很多通过输出流提取纯文本的例子。但是,我已经进行了一些基本的内存分析实验...并且我还没有找到使用这些库(Tika、POI 或 PDFBox)中的任何一个来避免将整个文档加载到主内存中的方法。

在从流读取和写入流之间,中间显然存在转换步骤......我还没有找到在流基础上执行的方法。我是否遗漏了某些内容,或者这是使用 Tika/POI/PDFBox 从 MS Office 或 PDF 文件中提取文本的已知问题?我能否拥有真正的端到端流式传输,而无需在整个过程中的任何时候将文件完全加载到主内存中?

最佳答案

如果您关心内存占用,首先要确保您使用的是 TikaInputStream backed by a File ,例如从类似的更改

InputStream input = new FileInputStream("foo.xls");

类似的事情

InputStream input = TikaInputStream.get(new File("foo.xls"));

如果您确实只有一个InputStream,而不是一个文件,并且您希望尽可能使用较低的内存选项,请强制Tika 将其缓冲到临时文件中,例如

InputStream origInput = getAnInputStream();
TikaInputStream input = TikaInputStream.get(origInput);
input.getFile();

许多(但并非所有)解析器都能够利用支持文件并仅将它们需要的位读取到内存中,而不是缓冲整个内容,这将有所帮助

.

下一步,确保您的 ContentHandler 在输出之前不会将整个内容缓冲到内存中。任何对结果文档进行 XPath 查找的内容都可能被淘汰,任何具有内部 StringBuffer 或类似内容的内容也可能被淘汰。选择一个更简单的,并确保您已设置好将生成的 html/文本 sax 事件写入到某个地方

.

最后,并非所有 Tika 解析器都支持流处理。有些只能通过解析整个文件的结构,然后遍历该结构来找到要输出的有趣位。有了这些,使用文件支持的 TikaInputStream 可能会有所帮助,但不会阻止大量内存的使用。

IIRC,低内存解析器包括:

  • .xls
  • .xlsx
  • 所有基于 ODF 的格式
  • XML

在能够输出任何内容之前加载+解析大部分/全部文件的一些常见文档解析器包括:

  • .doc/.docx/.ppt/.pptx
  • .pdf
  • 图片
  • 视频

关于java - 使用 POI 或 Tika 提取文本,流到流,无需将整个文件加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25043720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com