我正在尝试制作几个文本文档的索引。
他们的内容只是以字段标签分隔的字符串:
WORD<\t>w1<\t>w2<\t>...<\t>wn
POS<\t>pos1<\t>pos2_a:pos2_b:pos2_c<\t>...<\t>posn_a:posn_b
...
对于POS字段,':'-
分隔的标记对应于相同的歧义字。
共有5个文档,总大小为10 MB。 索引时,java使用大约2 GB的RAM并最终抛出OOM错误。
String join_token = tok.nextToken();
// atomic tokens correspond to separate parses
String[] atomic_tokens = StringUtils.split(join_token, ':');
// marking each token with the parse number
for (int token_index = 0; token_index < atomic_tokens.length; ++token_index) {
atomic_tokens[token_index] += String.format("|%d", token_index);
}
String join_token_with_payloads = StringUtils.join(atomic_tokens, " ");
TokenStream stream = new WhitespaceTokenizer(Version.LUCENE_41, // OOM exception appears here
new StringReader(join_token_with_payloads));
// all these parses belong to the same position in the document
stream = new PositionFilter(stream, 0);
stream = new DelimitedPayloadTokenFilter(stream, '|', new IntegerEncoder());
stream.addAttribute(OffsetAttribute.class);
stream.addAttribute(CharTermAttribute.class);
feature = new Field(name,
join_token,
attributeFieldType);
feature.setTokenStream(stream);
inDocument.add(feature);
从内存的角度看这个代码有什么问题,以及如何使用RAM中保存的尽可能少的数据进行索引?
答案 0 :(得分:1)
如果我理解问题(我没试过),这是我的建议