etspring
@etspring
Начитанное быдло

Как быстро вывести БОЛЬШОЙ объем данных в STDOUT в Ruby?

Доброго времени суток.
Задача заключается в быстром выводе в STDOUT сотен миллионов строк.
Код исполняется в докер-контейнере с 2-мя ядрами и 4 Гб оператики.
Ruby 2.7.0

Теперь псевдоконкретика:
Имеются несколько файлов ( каждый от 2 000 000 до 3 000 000 строк ) , которые читаются построчно, каждая строка выводится от 10000 до 150000 раз.

def print_gen(line)
  rand(10000..150000).times do
    $stdout.write(line)
  end
end

['1.txt', '2.txt', '3.txt'].each do |file|
  fork do
    File.readlines(file).each do |line|
      print_gen(line)
    end
  end
end
Process.waitall


Результат работы:
time ruby start.rb > test.txt
real	1m13,236s
user	1m12,338s
sys	0m1,011s

wc -l test.txt
119245 test.txt

Профайлер четко показывает проблему с IO.wait
При использовании threads картина схожая.

Каким образом можно ускорить процесс?
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 1
При чем здесь вывод в stdout к чтению логов?
$stdout.write
Тест не имеет смысла.
File.each_line эффективнее в потреблении памяти.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы