2011-04-20 94 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