Задать вопрос
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
  • Вопрос задан
  • 158 просмотров
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Thinknetica
    Профессиональная разработка на Ruby on Rails
    9 месяцев
    Далее
  • Хороший программист
    Интенсив по Ruby on Rails
    5 месяцев
    Далее
  • Thinknetica
    Оптимизация Ruby/Rails-приложений
    9 недель
    Далее
Решения вопроса 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)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы