Параллельное составление ZIP-архивов
Обзор
Aspose.ZIP API предоставляет возможность создавать ZIP-архивы. Поскольку записи такого архива можно сжимать независимо, создание архива можно в некоторой степени распараллелить.
Многопоточный ZIP: объяснение
Используйте ParallelOptions, чтобы указать, что архив необходимо подготовить с несколькими ядрами ЦП.
Настройка ParallelCompressInMemory указывает стратегию, которую мы выбираем для многозадачности. Вот три варианта:
ParallelCompressionMode.Never
: сжатие всех записей является последовательным. Только одно ядро ЦП работает над сжатием и сбрасывает сжатые данные по мере их поступления.ParallelCompressionMode.Always: принудительно сжимает записи в разных потоках независимо от размера записи, доступной памяти и других факторов. Каждое ядро ЦП одновременно сжимает файл, сохраняя сжатые данные в оперативной памяти. После сжатия записи она сбрасывается в поток результатов. Если объем вашей оперативной памяти невелик, а общий размер некоторых N записей (где N — количество ядер ЦП) огромен, может случиться так, что вся оперативная память, доступная для CLR, исчерпается и возникнет OutOfMemoryExcepton.
ParallelCompressionMode.Auto
: интеллектуальный режим. Он оценивает количество ядер ЦП, размеры записей, доступную память и выбирает, сжимать ли записи параллельно или последовательно. В этом режиме некоторые записи меньшего размера сжимаются параллельно, а другие - последовательно. Записи LZMA не сжимаются параллельно из-за высокого потребления памяти. Как правило, этот вариант безопасен: Aspose.ZIP осторожно относится к оценкам и переключается на последовательное сжатие в качестве запасного варианта. Для этого режима есть еще одно свойство ParallelOptions — AvailableMemorySize. Для любого другого режима это бессмысленно. Грубо говоря, это верхний предел выделяемой памяти при сжатии записей всеми ядрами процессора в мегабайтах. Aspose.ZIP использует это число для оценки максимального размера записи, которую можно безопасно сжимать параллельно. Записи, превышающие пороговое значение, подлежат последовательному сжатию. Доступный размер памяти — это палка о двух концах: если он установлен слишком высоко с огромными записями, это может привести к нехватке оперативной памяти, интенсивной подкачке и даже к исключению нехватки памяти. Если установлено слишком низкое значение, большинство записей будут сжиматься последовательно без особого ускорения. Таким образом, опытные пользователи могут назначить его, учитывая компромисс.
Мы рекомендуем вам поэкспериментировать с различными режимами параллельного сжатия ваших типичных данных, чтобы определить, какие настройки лучше всего подходят для вашего случая.
Как создать ZIP-архив с параллельным сжатием в примере C#
Шаги: Создайте ZIP-архив с параллельным сжатием на C#< /а>
- Откройте поток файлов («FileStream») в «FileMode.Create», чтобы создать новый ZIP-файл («archive.zip»).
- Инициализируйте новый объект «Архив» для управления записями ZIP.
- Используйте метод CreateEntry, чтобы добавить несколько записей, например «first.bin» и «last.bin», используя File.OpenRead для чтения из исходных файлов (data1.bin и
dataN.bin
). - Настройте «ArchiveSaveOptions» с помощью «ParallelOptions», где для параметра «ParallelCompressInMemory» установлено значение «ParallelCompressionMode.Always», что позволяет параллельное сжатие для более быстрого архивирования.
- Сохраните архив с указанными параметрами методом
Сохранить
.
1 using (FileStream zipFile = File.Open("archive.zip", FileMode.Create))
2 {
3 using (Archive archive = new Archive())
4 {
5 archive.CreateEntry("first.bin", File.OpenRead("data1.bin"));
6 ...
7 archive.CreateEntry("last.bin", File.OpenRead("dataN.bin"));
8 archive.Save(zipFile, new ArchiveSaveOptions()
9 {
10 ParallelOptions = new ParallelOptions()
11 { ParallelCompressInMemory = ParallelCompressionMode.Always }
12 });
13 }
14 }