gpt4 book ai didi

java - Lucene 索引器在小型文档集合上出现内存不足问题

转载 作者:行者123 更新时间:2023-12-01 14:45:22 25 4
gpt4 key购买 nike

我正在尝试为多个文本文档创建索引。

它们的内容只是字段制表符分隔的字符串:

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 中保存的尽可能少的数据进行索引?

最佳答案

如果我正确理解了问题(我没有尝试过),这就是我的建议

  1. 在代码中使用驼峰式大小写是一种很好的做法,这是 Java 的惯例
  2. 您无需手动生成位置,只需使用 Field.TermVector.WITH_POSITIONS_OFFSETS 创建一个字段,指标就会最终出现在索引中。
  3. 创建如此巨大的字符串数组会导致非常大的内存开销 -> 使用 StringBuilder。
  4. 使用 LetterTokenizer 对流进行标记,或通过扩展 CharTokenizer 编写您自己的标记生成器
  5. 顺便说一句,很棒的书 Lucene in Action

关于java - Lucene 索引器在小型文档集合上出现内存不足问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15471200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com