Вам нужно добавить какой-то буфер, чтобы можно было читать куски, а затем записывать их все вместе. Думаю, было бы разумно разделить ваш скрипт на разбор и загрузку. Сосредоточьтесь на одном:
Ваша оригинальная линия:
...
sftp.file.open("#{@sftp_details['server_folder_path']}/#{entry.name}") do |file|
...
Если вы проверите исходный файл метода download!
(не забывайте, взрыв!), Вы можете использовать 'stringio'. Заглушка, которую вы можете легко настроить. Обычно достаточно буфера по умолчанию, который составляет 32 КБ. Вы можете изменить его, если хотите (см. Пример).
Заменить на (работает только с отдельными файлами):
Использование StringIO
:
...
io = StringIO.new
sftp.download!("#{@sftp_details['server_folder_path']}/#{entry.name}", io.puts, :read_size => 16000))
ИЛИ вы можете просто скачать файл
...
file = File.open("/your_local_path/#{entry.name}",'wb')
sftp.download!("#{@sftp_details['server_folder_path']}/#{entry.name}", file, :read_size => 16000)
....
В Документе вы можете использовать опцию :read_size
:
: read_size - максимальное количество байтов для чтения за раз из
источник. Увеличение этого значения может улучшить пропускную способность. По умолчанию
32 000 байт.