Самый эффективный метод для чтения ввода в Ruby - PullRequest
4 голосов
/ 15 декабря 2010

В Ruby, какой самый эффективный метод для чтения гигантских текстовых файлов? Порядка 10 7 строк с 89 байтами / строка. Один метод значительно лучше другого?

1 Ответ

4 голосов
/ 15 декабря 2010

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

Чтение текстового файла размером 188 593 869 байт в качестве базовой линии:

IO.foreach(ARGV.shift) do |li|
  print li
end

time ruby test.rb root.mbox > /dev/null
# 
# real    0m3.949s
# user    0m3.709s
# sys     0m0.182s

Я сбрасываю его в / dev / null, чтобы убрать экранный ввод / вывод из времени.

Вместо того, чтобы читать исключительно построчно, загрузите его большим куском, а затем выполните итерации по строкам:

File.read(ARGV.shift).lines do |l|
  print l
end

time ruby test.rb root.mbox > /dev/null

real    0m3.492s
user    0m3.281s
sys     0m0.209s

Это 0,5 секунды экономии. Он также занимал 188 МБ данных, что вряд ли хорошо масштабируется, если у вас есть большие файлы. Приятно то, что вы можете сказать ему загрузить весь файл, что я и сделал, используя read(), или указать ограничить размер чтения.

Вот очищенный вывод из wc для текстового файла для вашей справки:

lines: 2,465,369
words: 26,466,463
bytes: 188,593,869
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...