Динамическое создание больших почтовых индексов для клиентских загрузок - PullRequest
5 голосов
/ 05 сентября 2011

Существует проект, в котором каждый пользователь может загрузить zip-файл, содержащий около 2 ГБ данных ...

Единственная проблема - в нем есть пара очень маленьких файлов, которые должны измениться в этом zip-файле.user.

Есть ли элегантный способ решить эту проблему, не требуя, чтобы все было в zip?Идеи, которые я рассмотрел:

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

2) Каким-то образом манипулировать zip-файлом в PHP, прежде чем отправлять с помощью необработанного вида push (т.е. выплевывать заголовок, а затем генерировать данные на основе файлов + пользовательских файлов)

Какие-нибудь идеи для лучшего подхода или проблем памяти, с которыми я мог бы столкнуться?Спасибо!

Ответы [ 3 ]

2 голосов
/ 05 сентября 2011

Структура файла ZIP в основном:

  1. Магический заголовок, идентифицирующий файл как архив ZIP.
  2. Все данные файла, объединенные вместе.(Отдельные файлы могут быть дополнительно сжаты.)
  3. Каталог архива, содержащий метаданные файла (имена, размеры и т. Д.), А также смещение к данным файла.

Этоозначает, что вы должны иметь возможность создавать и выводить архив ZIP на лету, требуя, чтобы только данные каталога оставались в памяти, пока вы не сможете их записать в конце.Сам архив ZIP никогда не должен существовать на диске.

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

0 голосов
/ 05 сентября 2011

Вы смотрели на расширение zip в PHP? http://php.net/zip

Из того, что я видел, вы можете управлять архивами ZIP на лету ООП. Я просто не уверен насчет производительности, может быть, 2-гигабайтные архивы могут занять некоторое время, но вам придется попробовать это самим.

0 голосов
/ 05 сентября 2011

imho

вы можете рассмотреть два подхода к zip-файлу

  1. первый zip-файл будет содержать все общие файлы, и сделать его статическим файлом для загрузки(Однако передача Gb не надежна через http, вы можете предложить пользователю использовать scp, ftp или любую клиентскую программу, которая позволяет продолжить загрузку)
  2. second zip (php script) должен содержать пару очень маленьких файлов, которые указываюттолько для пользователя, в этом случае вы можете иметь минимальные накладные расходы на память / дисковое пространство
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...