我正在处理应该读取大量文件的应用程序(测试集大约是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部分编写很多(任何?)代码,因为这是使用此处人员编写的现有库完成的。