Некоторое время назад я провел несколько тестов, чтобы увидеть, как можно было бы загрузить текстовый файл. Быстрее всего было прочитать текстовые блоки, а затем перебрать их, используя 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