Доброго времени суток.
Задача заключается в быстром выводе в 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 картина схожая.
Каким образом можно ускорить процесс?