У меня есть функция в приложении Ruby on Rails, которая выполняет резервное копирование всех данных учетной записи пользователя, чтобы они могли загрузить их в ZIP-файл и сохранить их локально.
Чтобы создать ZIP-файл, я 'я делаю следующее:
Использование ZIP :: OutputStream для открытия потока файлов ZIP.
Работа с каждой из соответствующих моделей вучетную запись пользователя, преобразовав все записи в этой модели в CSV, а затем добавив каждый CSV в ZIP-файл.
Отправка полученного ZIP-файла в AWS S3.
Вот некоторый псевдокод для иллюстрации процесса:
output_stream = Zip::OutputStream.write_buffer do |zos|
@models_to_backup.each do |model|
csv = model.convert_to_csv_file
zos.put_next_entry("csv_files/#{model.name}.csv")
zos.write csv
end
end
output_stream.rewind
SendFileToS3(output_stream)
Это прекрасно работает для небольших файлов, но большинство пользователей имеют более 100 000 записей.Таким образом, когда генерируется ZIP :: OutputStream, я быстро сталкиваюсь с проблемами памяти (я размещаю приложение на Heroku), поскольку весь поток вывода сохраняется в памяти до его отправки.
Есть либолее эффективный способ памяти для создания этих файлов ZIP?Существует ли способ потоковой передачи ZIP на S3 в пакетном режиме по мере его создания, чтобы избежать создания всего файла ZIP в памяти?Или мне просто нужно предоставить сервер с более высоким лимитом памяти для этого?