У меня есть какой-то Ruby, который загружает большой XML-файл (~ 380 МБ).
Я использую on_body
для загрузки его кусками:
to = File.open('/path', 'wb')
http = HTTPI::Request.new(options)
http.url = uri
http.on_body { |chunk| to.write(chunk) }
HTTPI.get(http, :net_http)
to.close
on_body
в соответствии с документацией (https://www.rubydoc.info/gems/httpi/HTTPI/Request#on_body-instance_method) будет читать ответ кусками, чтобы предотвратить заполнение памяти.
Кажется, это работает, на практике мое использование памяти увеличивается примерно на ~ 178 МБ после загрузкифайл, поэтому некоторая сборка мусора может происходить во время потоковой передачи файла, иначе я бы ожидал, что он прыгнет на полный размер файла.
Однако, после этого, 178 МБ просто зависает вечно.
Я сузил его до того, что это связано с загрузкой файла.Если я прочитал тот же XML-файл с диска, объем памяти увеличился примерно на 4 МБ после того, как я закончил обработку файла.