我遇到的情况是,我有一个每小时执行的批处理工作,该工作必须解析大量RSS提要,并从每个提要的每个项目中提取标题和描述元素的文本,并转换成字符串,然后由Lucene计算其词频

但是,由于不知道每个提要多少个提要或项目,每个字符串可能包含数千个单词。

我想我正在看的基本伪代码是这样的:

for each feed
   for each item within date/time window
      get text from title element, concatenate it to title_string
      get text from description element,
          concatenate it to description_string
          calculate top x keywords from title_string

for each keyword y in x
   calculate frequency of keyword y in description_string


谁能建议如何处理这些数据以减少内存使用量?从每个提要读取数据时,这与使用StringBuilders有所不同。

尽管提要的内容将存储在数据库中,但我想“即时”计算单词频率,以避免每个提要都有自己的数据库表时所需的所有IO。

最佳答案

首先,如果您已经拥有Lucene,我不明白为什么要在数据库中存储文本。 Lucene是一种数据库,它的索引建立在单词的基础上,而不是记录id的,这是文本文档的唯一区别。例如,您可以将提要中的每个项目存储为带有“标题”,“描述”等字段的单独文档。如果您需要存储有关提要本身的信息,请为提要创建另一种类型的文档,生成ID并放入此ID作为所有供稿项目的参考。

如果执行此操作,则可以在恒定时间内计数字的频率(嗯,不是真正的恒定时间,而是近似恒定的)。是的,这会导致IO,但是使用数据库保存文本也可以。读取单词频率信息的速度非常快:Lucene使用称为倒排索引的数据结构,即存储word -> vector of < doc_number/frequency > pairs的映射。搜索时,Lucene不会读取文档本身,而是会读取索引并检索此类地图-足够小,可以非常快速地读取。

如果不是将文本存储在Lucene索引中,而您只需要有关单词频率的信息,请使用内存索引来分析每批独立的提要,将频率信息保存在某处并删除索引。另外,在向文档添加字段时,请将store参数设置为Field.Store.NO以仅存储频率信息,而不存储字段本身。

关于java - 在Java和Lucene中处理来自RSS提要的大量字符串的最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4361077/

10-11 23:45