2ord
@2ord
продвинутый чайник

Как в Ruby эффективнее обработать stdin?

require "memory_profiler"
report = MemoryProfiler.report do
    $stdout.sync = true
    ARGF.each_char do |c|
        $stdout.print(c)
    end
end

report.pretty_print(to_file: 'memory_profiler.log')


Протестировал таким способом:
dd if=/dev/zero bs=1M count=1 | ruby test_stream.rb | wc -c

При размере 1МБ профайлером показывает потребление аж 42МБ !
ARGF.each_char
  • Вопрос задан
  • 35 просмотров
Решения вопроса 1
@vsuhachev
Если читать через единожды выделенный буфер, то все летает и память не ест..

require "memory_profiler"

report = MemoryProfiler.report do
  $stdout.sync = true

  buffer_size = 5_000
  buffer = String.new("", capacity: buffer_size)

  while (readed = $stdin.read(buffer_size, buffer))
    $stdout << readed
  end
end

report.pretty_print(to_file: "memory_profiler.log")



Total allocated: 5545 bytes (4 objects)
Total retained: 5041 bytes (1 objects)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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