Каков наилучший способ создать большой ZIP-файл с данными Rails и отправить его в хранилище Amazon S3? - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть функция в приложении Ruby on Rails, которая выполняет резервное копирование всех данных учетной записи пользователя, чтобы они могли загрузить их в ZIP-файл и сохранить их локально.

Чтобы создать ZIP-файл, я 'я делаю следующее:

  1. Использование ZIP :: OutputStream для открытия потока файлов ZIP.

  2. Работа с каждой из соответствующих моделей вучетную запись пользователя, преобразовав все записи в этой модели в CSV, а затем добавив каждый CSV в ZIP-файл.

  3. Отправка полученного 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 в памяти?Или мне просто нужно предоставить сервер с более высоким лимитом памяти для этого?

1 Ответ

0 голосов
/ 22 сентября 2019

Отвечая на мой вопрос на случай, если кто-нибудь увидит это в будущем.Изучив это несколько дней, я не смог найти отличного решения.

Мой несколько хакерский обходной путь - просто временно использовать Heroku Performance-L dyno (который имеет 14 ГБ памяти), когда я бегурезервное копирование (должно происходить только раз в месяц). Возможно, это не самое элегантное решение, но оно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...