2011-04-20 96 views
0

现在,我在lucene中的文档可以在一个字段中有非常大的值(从0到数百MB)。递减索引Lucene文档的内存使用率

我使用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将最终读取到内存?

回答

0

通过Lucene的代码来看,该Reader你传递到最终Field被传递到您的标记化数据TokenStream (即在DocInverterPerField)。因此,您的计划肯定会节省内存,因为它会直接从该阅读器流入以进行索引。您需要在FileReader的顶部使用BufferedReader以获得更好的性能。

1

java.io.Reader实现被设计为通过将部分流读入内存来有效地读取字符流。 (见read(char[] cbuf) API)。所以我会说“是的”,使用阅读器会降低你的内存开销

+0

当然,但这里的魔鬼是读者如何使用阅读文档,然后索引它。如果整个字符串在某个时候被读入内存,那么对我而言这并不好。 – Persimmonium 2011-04-20 09:48:52

+0

阅读器内容似乎已被添加到索引中。只要经常调用commit()(并且不使用基于内存的索引),内存需求应该是可管理的。 – qwerty 2011-04-20 10:00:44