Java读取和索引大量文件

时间:2016-09-07 08:29:33

标签: java spring elasticsearch spring-boot apache-tika

我正在处理应该读取大量文件的应用程序(测试集大约是80.000个文件)。然后它从这些文件中提取文本。这些文件可以是来自txt,pdf,docx等的任何文件,并将使用Apache Tika进行解析。

提取文本后,它将在ElasticSearch中编入索引以便可搜索。到目前为止,弹性在这方面并不是一个问题。

运行此应用程序的服务器将具有有限的RAM(约2GB)

电流

Tika实施如下:

private static final int PARSE_STRING_LIMIT = 100000;
private static final AutoDetectParser PARSER_INSTANCE = new AutoDetectParser(PARSERS);
private static final Tika TIKA_INSTANCE = new Tika(PARSER_INSTANCE.getDetector(), PARSER_INSTANCE);

public String parseToString(InputStream inputStream) throws IOException, TikaException {
    try {
        return TIKA_INSTANCE.parseToString(inputStream, new Metadata(), PARSE_STRING_LIMIT);
    } finally {
        IOUtils.closeQuietly(inputStream); //should already be closed by parseToString.
    }
}

对于每个文件,都会创建一个文档对象,并为ElasticSearch映射指定适当的值。文本提取如下:

String text = TIKA_INSTANCE.parseToString(newBufferedInputStream(new FileInputStream(file)));
attachmentDocumentNew.setText(text);
text = null;

还有一点需要注意的是,这是一个Spring-boot应用程序,最终将作为服务器运行,因此只要需要索引(以及其他一些内容,如统计信息),就可以调用它。

使用以下VM参数运行jar:

java -Xms512m -Xmx1024m -XX:UseG1GC -jar <jar>

问题

每当我开始索引文件时,我都会得到OutOfMemoryException。我尝试使用VisualVM对其进行分析,但它主要是char []和byte [],它们不提供大量信息。我也不精通多线程或分析(我现在也不熟悉),因为我只有2年的编程经验。

问题

如何在不破坏索引的情况下减少应用程序的内存占用量?

如果以上内容过于具体,也许是一个更普遍的问题: 如何在阅读大量文件时减少内存使用量?

如果您有建立这样的经验,我也会对任何建议持开放态度。)

修改

为了澄清,我必须为应用程序的Elasticsearch部分编写很多(任何?)代码,因为这是使用此处人员编写的现有库完成的。

0 个答案:

没有答案