Java 减少索引Lucene文档的内存使用

Java 减少索引Lucene文档的内存使用,java,memory,lucene,Java,Memory,Lucene,现在,我在lucene中的文档可以在一个字段中包含非常大的值(从0到数百MB) 我使用的是Lucene 3.1.0,我创建的文档如下: doc = new Document(); Field field = new Field(fieldname, VERYLARGEVALUE, store, tokenize, storevector); doc.add(field); 其中VERYLARGEVALUE是内存中的字符串。我在想,可能在创建文件时将VERYLARGEVALUE写入文件(它是通过

现在,我在lucene中的文档可以在一个字段中包含非常大的值(从0到数百MB)

我使用的是Lucene 3.1.0,我创建的文档如下:

doc = new Document();
Field field = new Field(fieldname, VERYLARGEVALUE, store, tokenize, storevector);
doc.add(field);
其中VERYLARGEVALUE是内存中的字符串。我在想,可能在创建文件时将VERYLARGEVALUE写入文件(它是通过从多个源中提取文本创建的,因此它是增量的),然后使用:

Field field = Field(String name, Reader reader, Field.TermVector termVector); 
doc.add(field);
读卡器从我写入VERYLARGEVALUE的文件中读取


这会降低内存需求还是VERYLARGEVALUE迟早会被读入内存?

java.io.Reader实现的目的是通过将部分流读入内存来高效地读取字符流。(参见API。)所以我会说“是”,使用读卡器可以减少内存开销

查看Lucene代码,传递到
字段
读卡器
最终会传递到标记数据的
令牌流
(即在
docinverterfield
)。因此,您的计划肯定会节省内存,因为它将直接从读卡器流式生成索引。您可能希望在
文件读取器
上使用
缓冲读取器
,以获得更好的性能。

当然可以,但这里的问题在于如何使用读取器来读取文档并随后对其进行索引。如果整个字符串在某个时候被读入内存,对我来说就没有好处了。阅读器的内容似乎被添加到了索引中。只要您经常调用commit()(并且不使用基于内存的索引),内存需求应该是可管理的。