Ste*_*ins 1 java ms-office apache-poi pdfbox apache-tika
我正在尝试单独使用 Apache POI 和 PDFBox,或者在 Apache Tika 的上下文中,从 MASSIVE Microsoft Office 和 PDF 文件(即在某些情况下数百兆)中提取和处理纯文本。此外,我的应用程序是多线程的,因此我将同时解析许多这些大文件。
在这种规模下,我必须以流式方式处理文件。在此过程中的任何步骤都不能将整个文件保存在主内存中。
我见过许多通过输入流将文件加载到 Tika/POI/PDFBox 的源代码示例。我见过很多通过输出流提取纯文本的例子。但是,我已经执行了一些基本的内存分析实验......我还没有找到使用这些库(Tika、POI 或 PDFBox)中的任何一个的方法来避免将整个文档加载到主内存中。
在从流读取和写入流之间,中间显然有转换步骤......我还没有找到一种在流的基础上执行的方法。我是否遗漏了什么,或者这是使用 Tika/POI/PDFBox 从 MS Office 或 PDF 文件中提取文本的已知问题?我是否可以进行真正的端到端流传输,而不会在传输过程中的任何时候将文件完全加载到主内存中?
如果您关心内存占用,首先要确保您使用的是由 File 支持的TikaInputStream,例如从类似的更改
InputStream input = new FileInputStream("foo.xls");
Run Code Online (Sandbox Code Playgroud)
像
InputStream input = TikaInputStream.get(new File("foo.xls"));
Run Code Online (Sandbox Code Playgroud)
如果你真的只有一个 InputStream 而不是一个文件,并且如果可能的话你想要较低的内存选项,强制 Tika 将它缓冲到一个临时文件中,例如
InputStream origInput = getAnInputStream();
TikaInputStream input = TikaInputStream.get(origInput);
input.getFile();
Run Code Online (Sandbox Code Playgroud)
许多(但并非所有)解析器将能够利用后备文件并仅将他们需要的位读取到内存中,而不是缓冲整个内容,这将有所帮助
.
接下来,确保您的 ContentHandler 在输出之前不会将整个内容缓冲到内存中。任何在结果文档上进行 XPath 查找的东西都可能会被淘汰,任何具有内部 StringBuffer 或类似的东西也是如此。选择一个更简单的,并确保您已设置好在它们进来时将结果 html / text sax 事件写入某处
.
最后,并非所有 Tika 解析器都支持流处理。有些只能通过解析整个文件的结构来工作,然后在其中徘徊,找到要输出的有趣位。有了这些,使用文件支持的 TikaInputStream 可能会有所帮助,但不会停止使用相当多的内存。
IIRC,低内存解析器包括:
在能够输出任何内容之前加载+解析大部分/所有文件的一些常见文档解析器包括:
| 归档时间: |
|
| 查看次数: |
2544 次 |
| 最近记录: |