Как сделать этот код поиска строки Groovy более эффективным? - PullRequest
1 голос
/ 05 марта 2009

Я использую следующий код Groovy для поиска в файле строки, номера счета. Файл, который я читаю, имеет размер около 30 МБ и содержит 80 000–120 000 строк. Есть ли более эффективный способ найти запись в файле, который содержит данный AcctNum? Я новичок, поэтому я не знаю, какую область исследовать, toList() или цикл for. Спасибо!

AcctNum = 1234567890

if (testfile.exists())
{
  lines = testfile.readLines()
  words = lines.toList() 
  for (word in words) 
  {
    if (word.contains(AcctNum)) { done = true; match = 'YES' ; break }
    chunks += 1
    if (done) { break }
  }
}

Ответы [ 4 ]

3 голосов
/ 05 марта 2009

К сожалению, на моем текущем ноутбуке не установлен Groovy, но я не ожидаю, что вам вообще придется звонить toList(). Я также надеюсь, что вы могли бы выразить условие в закрытии, но мне придется обратиться к Groovy в действии, чтобы проверить ...

Сказав это, вам действительно нужно разделить его на строки? Не могли бы вы просто прочитать все, используя getText(), а затем просто использовать один вызов contains()?

РЕДАКТИРОВАТЬ: Хорошо, если вам нужно найти фактическую строку, содержащую запись, вам нужно позвонить readLines(), но я не думаю, что вам нужно позвонить toList() впоследствии. Вы должны быть в состоянии просто использовать:

for (line in lines) 
{
  if (line.contains(AcctNum)) 
  {
     // Grab the results you need here
     break;
  }
}
1 голос
/ 05 марта 2009

Когда вы говорите эффективный , вы обычно должны решить, какое направление вы имеете в виду: должно ли оно работать быстро или использовать как можно меньше ресурсов (памяти, ...). Часто оба лежат на противоположных сайтах, и вы должны выбрать компромисс.

Если вы хотите осуществлять поиск, ориентированный на память, я бы посоветовал читать файл построчно, а не читать его сразу, что, как я подозреваю, происходит (я был бы неправ, но в других языках что-то вроде readLines читает весь файл в массив строк).

Если вы хотите, чтобы он работал быстро, я бы предложил, как уже упоминалось, прочитать сразу весь файл и найти заданный шаблон. Вместо того, чтобы просто проверять содержимое, вы можете использовать indexOf, чтобы получить позицию, а затем прочитать запись по мере необходимости из этой позиции.

0 голосов
/ 05 марта 2009

если вы контролируете формат файла, который вы читаете, решение заключается в добавлении в индекс.

Фактически, именно так базы данных могут быстро находить записи.

Но для 30 МБ данных я думаю, что современный компьютер с приличным жестким диском должен сделать свое дело, а не усложнять программу.

0 голосов
/ 05 марта 2009

Мне следовало бы объяснить это лучше, если я найду запись с AcctNum, я извлечу другую информацию о записи ... поэтому я подумал, что мне нужно разбить файл на несколько строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...