Архивирование большого количества PDF файлов в ZIP - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть приложение Ruby on Rails 5.1, в котором я создаю PDF-файлы, которые представляют записи в базе данных.

Мне нужно заархивировать эти PDF-файлы, чтобы они могли храниться вне приложения.

Это в основном одноразовое событие, поэтому мне не нужна постоянная синхронизация.

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

Это работает, но если у вас много записей записей, время ожидания веб-сервера истечет, поэтому мне нужно найти лучший подход, который не перегруженвся память сервера.

Размер файла ZIP может составлять 200 МБ, при этом в нем содержится более 10 000 файлов PDF.

Я размещаю приложения в своих собственных контейнерах, поэтому могу получить доступ к файлу сервера.каталог, если это необходимо, но каждое повторное развертывание или завершение работы контейнера приведет к его удалению.

Подход, который я думаю о реализации, заключается в следующем:

  1. Запустите архив вфоновый процессор, который отправляет пользователю электронное письмо по окончании ссылки на скачивание.
  2. Разбиение записей в отдельный ZIP для каждых 100 записей или около того (чтобы избежать проблем с памятью и отдельных файлов, которые слишком велики).
  3. Храните ZIP-файлы в каталоге контейнера в течение 24 часов и позволяйте пользователям загружать архивы по своей ссылке электронной почты (у них будет отдельная ссылка для каждого ZIP-файла).
  4. Стирать ZIP-файлы tmpна контейнере через 24 часа.

Впервые я совершил что-то подобное;разумен ли такой подход?Что может быть лучше для достижения цели архивирования PDF-файлов с сервера?

1 Ответ

0 голосов
/ 02 апреля 2019

Ваш подход разумен.Некоторые замечания:

  1. 100 записей на файл с ожидаемыми 10000 записями на запрос означает, что пользователю придется загружать и обрабатывать 100 файлов вручную, это не очень удобно для пользователя.Я бы посмотрел на создание большого файла не в памяти или потоковой передачи.Как только все размеры файлов известны - вы можете использовать nginx mod_zip для создания несжатого zip-файла на лету (это может быть полезно, если записи в экспорте могут происходить в нескольких различных экспортах).
  2. В зависимости от того, какмного времени занимает эта операция - может быть желательно обеспечить некоторый прогресс во время создания, чтобы пользователь не запустил несколько других экспортов, думая, что первый не сработал.
  3. экспорт должен выжить развертывание / перезапуск приложениятакже будь идемпотентом
...