Сжатие огромных файлов (> 2 ГБ) в ZIP на клиентской стороне

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

Я изучал методы сжатия, такие как JSZip или zip.js, но ни один из них из них хорошо работают с чрезвычайно большими файлами. Что я могу сделать?

Ответ 1

Вы можете сжимать до 4 ГБ данных с помощью zip.js, но:

  • он будет работать только с Chrome
  • он будет довольно медленным (около 30 минут на гигабайт сжатых данных на моем старом ноутбуке).

Вы можете попробовать его в Интернете с помощью этой демонстрации. Вы должны выбрать опцию "HDD" в входе "выбрать временное хранилище". Затем вы можете импортировать большие файлы из своей файловой системы и контролировать потребление памяти: она должна быть стабильной (около 300 МБ на моем ноутбуке).

Выбор "HDD" означает, что zip.js будет использовать File API: Каталоги и Система для хранения сжатых данных. Этот API в настоящее время доступен только в Chrome и позволяет записывать данные в изолированную виртуальную файловую систему. Демонстрация использует временное хранилище, которое не требует разрешения пользователя.

Изменить: вы также можете реализовать свой собственный конструктор Writer для потоковой передачи данных на ваш сервер, в то время как zip.js сжимает его: t полагаться на API файловой системы и работать с каждым поддерживаемым вами браузером. Писатель должен просто реализовать эти 2 метода:

init(callback[, onerror])
// initializes the stream where to write the zipped data

writeUint8Array(array, callback[, onerror])
// writes asynchronously a Uint8Array into the stream.

// getData method is optional

Вот пример пользовательских конструкторов Writer и Reader. Вы также можете посмотреть zip.js Реализации Writers для получения дополнительных примеров.

Ответ 2

Если вы ищете компрессор на стороне клиента, мне жаль говорить вам, что JS - это не путь.

В стороне от этого, лучше всего сказать своим пользователям просто сжать файлы перед их загрузкой. Или даже использовать какой-то другой инструмент (FTP может быть?).

EDIT:

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