Лучшие практики обработки большого количества строк из RSS-каналов в Java и Lucene - PullRequest
1 голос
/ 05 декабря 2010

У меня есть ситуация, когда у меня есть почасовая пакетная работа, которая должна анализировать большое количество RSS-каналов и извлекать текст элементов заголовка и описания из каждого элемента в канале в строки, которые затем будут вычислять частоты их слов.by 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, поскольку данные читаются из каждого канала.

Хотя содержимое каналов будет храниться в базе данных, я хочу вычислить частоты слов «на лету», чтобы избежать всех операций ввода-вывода, необходимых для каждого канала, имеющего собственную таблицу базы данных.

1 Ответ

1 голос
/ 06 декабря 2010

Во-первых, я не понимаю, почему вы хотите хранить текст в базе данных, если у вас уже есть Lucene.Lucene - это база данных с индексами, построенными на словах, а не на идентификаторах записей, и это единственное отличие для текстовых документов.Например, вы можете хранить каждый элемент в фиде как отдельный документ с полями «заголовок», «описание» и т. Д. Если вам нужно сохранить информацию о самом фиде, создайте еще один тип документов для фидов, сгенерируйте идентификатор и вставьтеэтот идентификатор как ссылка на все элементы фида.

Если вы сделаете это, вы можете посчитать частоту слов в постоянное время (ну, не реальное постоянное время, а приблизительно постоянное).Да, это приведет к IO, но использование баз данных для сохранения текста тоже сделает это.А чтение информации о частоте слов происходит чрезвычайно быстро: Lucene использует структуру данных, называемую инвертированным индексом , то есть хранит карту word -> vector of < doc_number/frequency > pairs.При поиске Lucene не читает сами документы, а вместо этого считывает индексы и получает такую ​​карту - она ​​достаточно мала, чтобы ее можно было читать очень быстро.

Если сохранение текста в индексе Lucene не вариант, и вам нужно толькоинформацию о частоте слов, используйте индекс в памяти , чтобы проанализировать каждую отдельную партию каналов, сохранить информацию о частоте где-нибудь и стереть индекс.Кроме того, при добавлении полей в документы установите для параметра store значение Field.Store.NO, чтобы хранить только информацию о частоте, но не само поле.

...