Сжатие и распаковка очень больших файлов с помощью System.IO.Compressing.Gzip
Моя проблема может быть описана следующими утверждениями:
- Я хотел бы, чтобы моя программа могла сжимать и распаковывать выбранные файлы
- У меня очень большие файлы (20 ГБ +). Можно с уверенностью предположить, что размер никогда не уместится в памяти
- Даже после сжатия сжатый файл может все еще не помещаться в память
- Я хотел бы использовать System.IO.Compression.GzipStream из .NET Framework
- Я хотел бы, чтобы мое приложение было параллельным
Поскольку я новичок в области сжатия / распаковки, у меня была следующая идея, как это сделать:
Я мог бы использовать разбить файлы на куски и сжать каждый из них по отдельности. Затем объедините их обратно в один сжатый файл.
Вопрос 1 об этом подходе - Сжатие нескольких кусков и затем объединение их обратно вместе даст мне правильный результат, то есть, если бы я должен был обратить процесс (начиная со сжатого файла, обратно в распакованный), получу ли я тот же исходный ввод?
Вопрос 2 об этом подходе. Имеет ли этот подход смысл для вас? Возможно, вы могли бы направить меня к хорошей лекции на эту тему? К сожалению, я не смог ничего найти сам.
1 ответ
Вам не нужно разбивать сжатие на части только для того, чтобы ограничить использование памяти. GZIP разработан для потокового формата и требует порядка 256 КБ ОЗУ для сжатия. Размер данных не имеет значения. Ввод может быть один байт, 20 ГБ или 100 ПБ - для сжатия все равно потребуется только 256 КБ ОЗУ. Вы просто читаете несжатые данные и записываете сжатые данные до тех пор, пока не закончите.
Единственная причина для разделения входных данных в виде диаграммы состоит в использовании нескольких ядер для сжатия. Что является вполне веской причиной для вашего количества данных. Тогда вы можете делать именно то, что вы описываете. Пока вы комбинируете выходные данные в правильном порядке, декомпрессия будет воспроизводить исходный ввод. Вы всегда можете объединить действительные потоки GZIP, чтобы создать действительный поток GZIP. Я бы порекомендовал сделать чанки относительно большими, например, мегабайтами, чтобы они не оказали заметного влияния на сжатие.
Таким образом, декомпрессия не может быть разбита на части, но она намного быстрее, так что, если бы вы могли, это принесло бы мало пользы. Декомпрессия обычно связана с вводом / выводом.