.Net Многопоточный Unzip - PullRequest
       2

.Net Многопоточный Unzip

1 голос
/ 18 августа 2011

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

Все библиотеки, которые я нашел, являются однопоточными для распаковки.

Является ли это недостатком формата ZIP вгенеральный?Существует ли многопоточная функция Unzip в мире .Net?(С интерфейсом Stream?)

Если нет ... есть ли технические причины, по которым это невозможно реализовать?


Дополнительная информация. Сжимаемые данные представляют собой резервные копии базы данных SQL Server размером ~ 30 ГБ, передаваемые из команды резервного копирования SQL Server (VDI) через ZipOutputStream в FileStream.

Ответы [ 2 ]

7 голосов
/ 21 августа 2011

Это не техническая невозможность.

DotNetZip не выполняет многопоточную декомпрессию, потому что я никогда не реализовывал ее. MT сжатие было приоритетом; Я это сделал. Я просто не удосужился сделать декомпрессию MT. Сжатие обычно является более ресурсоемкой и дорогостоящей операцией, чем распаковка; это особенно верно для DEFLATE, типичного алгоритма сжатия, используемого в архивах ZIP, из-за требования поиска. Хотя я не эксперт по алгоритмам сжатия, я бы предположил, что подобная характеристика применима и к другим алгоритмам сжатия. Нет необходимости искать во время декомпрессии, и в результате декомпрессия, как правило, происходит относительно быстрее. По этой причине оптимизация декомпрессии в DotNetZip была менее приоритетной.


Примечание: параллельное сжатие в DotNetZIp выполняется для одного файла: предположим, у вас есть файл из 1000 блоков (для произвольной длины блока). DotNetZip подключит несколько потоков к сжатию, каждый поток сжимает один блок. Поскольку потоки компрессора работают независимо, возможно, что сжатие для блока 6 закончится, например, до сжатия для блока 4. Следовательно, основной поток отвечает за сборку сжатых блоков обратно в правильном порядке, а затем записывает их в выходной поток.

Таким образом, каждая запись (файл) в zip-архиве сжимается полностью, прежде чем библиотека начнет сжимать следующую запись. Существует очевидная возможность применить дополнительный уровень параллелизма при сжатии: параллельное сжатие нескольких записей. DotNetZip не делает этого сейчас. Такой подход к параллелизму имеет смысл, когда создаваемый zip-файл состоит из большего числа меньших файлов, тогда как параллельное сжатие, которое DotNetZip делает сегодня, имеет смысл, когда zip-архив содержит любое количество более крупных файлов (больше 512 КБ или около того).

Используя DotNetZip сегодня, на типичном современном ноутбуке, ЦП насыщается при сжатии больших файлов, которые имеют более 10 блоков или около того, где типичный размер блока составляет 512 КБ. Таким образом, добавление нового уровня параллелизма вообще не ускорит этот сценарий. Но это поможет сценарию сжатия, скажем, 70000 небольших файлов в один архив.

2 голосов
/ 18 августа 2011

Это НЕ недостаток формата.Формат zip предназначен для произвольного доступа.Нет технической причины, по которой я могу подумать, что вы не сможете извлечь несколько файлов одновременно.Страница википедии на ней довольно подробно о формате.

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

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