Как я могу найти большой отсортированный файл в Perl? - PullRequest
1 голос
/ 22 декабря 2009

Можете ли вы предложить мне какие-либо модули CPAN для поиска в большом отсортированном файле?

Файл представляет собой структурированные данные размером от 15 до 20 миллионов строк, но мне просто нужно найти около 25 000 подходящих записей, поэтому я не хочу загружать весь файл в хеш.

Спасибо.

Ответы [ 5 ]

6 голосов
/ 22 декабря 2009

Perl хорошо подходит для этого, без необходимости внешнего модуля (из CPAN или где-либо еще).

Код:

while (<STDIN>) {
    if (/regular expression/) {
         process each matched line
    }
}

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

Поместите приведенный выше код в файл сценария и запустите его, перенаправив файл на стандартный ввод.

5 голосов
/ 22 декабря 2009

Сканирование всего файла может быть самым быстрым способом. Вы также можете попробовать File :: Sorted , который сделает бинарный поиск для данной записи. Размещение одной записи в файле с 25 миллионами строк должно потребовать около 15-20 запросов на каждую запись. Это означает, что для поиска 25 000 записей вам потребуется всего около 0,5 миллиона запросов / сравнений по сравнению с 25 000 000 для наивного изучения каждой строки.

Поскольку дисковый ввод-вывод является тем, чем он является, вы можете сначала попробовать простой способ, но File :: Sorted - теоретическая победа.

3 голосов
/ 23 декабря 2009

Похоже, вы действительно хотите базу данных. Рассмотрим SQLite с использованием модулей Perl DBI и DBD :: SQLite.

3 голосов
/ 23 декабря 2009

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

  • Разбейте файл на базу данных. Это может быть даже SQLite.
  • Предварительно индексируйте файл на основе данных, которые вы хотите найти.
  • Кэшировать результаты предыдущих поисков.
  • Выполнять общий поиск заранее, автоматически.

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

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

2 голосов
/ 22 декабря 2009

Когда вы обрабатываете входной файл с помощью while ( <$filehandle> ), он занимает файл только по одной строке за раз (для каждой итерации цикла), поэтому вам не нужно беспокоиться о том, что он забьет вашу память. Не так с циклом for, который забирает весь файл в память. Используйте регулярное выражение или что-то еще, чтобы найти то, что вы ищете, и поместите это в переменную / массив / хэш или запишите это в новый файл.

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