Самый быстрый способ разобрать большой файл в Ruby - PullRequest
7 голосов
/ 11 мая 2011

У меня есть простой текстовый файл, ~ 150 МБ.Мой код будет читать каждую строку, и если он соответствует определенным регулярным выражениям, он записывается в выходной файл.Но сейчас, просто требуется много времени, чтобы перебрать все строки файла (несколько минут), делая это как

File.open(filename).each do |line|
  # do some stuff
end

Я знаю, что это цикл по строкам файла, которыйзанимает некоторое время, потому что даже если я ничего не делаю с данными в «#do что-то», это все равно занимает много времени.

Я знаю, что некоторые программы Unix могут анализировать большие файлы, такие как этот, почти мгновенно (например, grep), поэтому мне интересно, почему ruby ​​(MRI 1.9) занимает так много времени, чтобы прочитать файл, и есть ли способ сделатьэто быстрее?

Ответы [ 3 ]

4 голосов
/ 11 мая 2011

Нечестно сравнивать с grep, потому что это сильно настроенная утилита, которая только сканирует данные, но не сохраняет их.Когда вы читаете этот файл с использованием Ruby, вы в конечном итоге выделяете память для каждой строки, а затем освобождаете ее во время цикла сбора мусора.grep - это довольно скудная и средняя машина обработки регулярных выражений.

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

`grep ABC bigfile`.split(/\n/).each do |line|
  # ... (called on each matching line) ...
end
1 голос
/ 11 мая 2011
File.readlines.each do |line|
  #do stuff with each line
end

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

0 голосов
/ 11 мая 2011

Вы должны прочитать это в память и затем проанализировать. Конечно, это зависит от того, что вы ищете. Не ожидайте чудесной производительности от ruby, особенно по сравнению с программами на c / c ++, которые оптимизируются последние 30 лет; -)

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