Обзор

Большинство алгоритмов сжатия были разработаны для одноядерных процессоров. Однако в эпоху многоядерных процессоров полезно использовать все ядра процессора для ускорения создания архивов. Aspose.ZIP предоставляет эту возможность для некоторых форматов архивов.

Параллельные методы для архивов BZIP2, LZIP и XZ.

Распараллеливание возможно благодаря блочному характеру этих алгоритмов. На программном уровне эти архивы используют общий подход многоядерного сжатия. Пользователь может установить количество потоков с помощью свойства CompressionThreads . Таким образом, если это свойство больше одного, будет использоваться несколько ядер ЦП.

Sample 1 – Parallel compression to BZIP2

    using (Bzip2Archive archive = new Bzip2Archive())
    {
        archive.SetSource("data.bin");
        archive.Save("archive.bz2", new Bzip2SaveOptions() { CompressionThreads = 4 });
    }

Sample 2 - Parallel compression to LZIP

    var settings = new LzipArchiveSettings(16777216) { CompressionThreads = 4 }
    using (LzipArchive archive = new LzipArchive(settings))
    {
        archive.SetSource("data.bin");
        archive.Save("archive.lz");
    }

Sample 3 - Parallel compression to XZ

    using (Bzip2Archive archive = new Bzip2Archive())
    {
        archive.SetSource("data.bin");
        archive.Save("archive.bz2", new Bzip2SaveOptions() { CompressionThreads = 4 });
    }

Как заархивировать папку с помощью .NET

ZIP-архивы служат для сжатия и объединения одного или нескольких файлов или папок в единый контейнер. В .NET вы можете использовать класс ZipFile для работы с ZIP-файлами и их сжатия. Основная цель архивирования обычно состоит в уменьшении размера файла для хранения или передачи, а также в использовании мер шифрования для повышения безопасности. Помимо традиционных инструментов сжатия файлов, функции автоматического сжатия/извлечения находят применение в различных настольных и веб-приложениях, облегчая такие задачи, как загрузка, загрузка, обмен или шифрование файлов.

Архивы 7Z LZMA2

Одним из методов сжатия формата 7Z является LZMA2 , который можно сжимать в несколько потоков. Как и в случае с предыдущими типами архивов, вы можете установить количество потоков через свойство CompressionThreads.

Sample 1 – Parallel compression to 7Z LZMA2

    var settings = new SevenZipEntrySettings(new SevenZipLZMA2CompressionSettings(){ CompressionThreads = 4 });
    using (SevenZipArchive archive = new SevenZipArchive(settings))
    {
        archive.CreateEntry("first.bin", "data.bin");
        archive.Save("result.7z");
    }

Параллельный метод для ZIP-архивов

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

Sample 1 – Parallel compression to zip

    using (Archive archive = new Archive())
    {
        archive.CreateEntries(@"C:\Data");
        archive.Save(zipFile, new ArchiveSaveOptions()
        {
            ParallelOptions = new ParallelOptions() 
            { ParallelCompressInMemory = ParallelCompressionMode.Auto }
        });
    }

Стратегия установки Parallel-Compress-In-Memory используется для многозадачности.

Настройка ParallelCompressInMemory указывает стратегию, которую мы выбираем для многозадачности. Вот три варианта :
ParallelCompressionMode.Never: сжатие всех записей является последовательным. Только одно ядро ​​ЦП работает над сжатием и сбрасывает сжатые данные по мере их поступления.
ParallelCompressionMode.Always: принудительно сжимает записи в разных потоках независимо от размера записи, доступной памяти и других факторов. Каждое ядро ​​ЦП одновременно сжимает файл, сохраняя сжатые данные в оперативной памяти. После сжатия записи она сбрасывается в поток результатов. Если объем вашей ОЗУ небольшой, а общий размер некоторых N записей (где N — количество ядер ЦП) огромен, может случиться так, что вся оперативная память, доступная для CLR, исчерпается и возникнет OutOfMemoryException.
ParallelCompressionMode.Auto: Он оценивает количество ядер ЦП, размеры записей, доступную память и выбирает, сжимать ли записи параллельно или последовательно. В этом режиме некоторые записи меньшего размера сжимаются параллельно, а другие - последовательно. Записи LZMA и PPMd не сжимаются параллельно из-за высокого потребления памяти. Как правило, этот вариант безопасен; Aspose.ZIP осторожно относится к оценкам и в качестве запасного варианта переключается на последовательное сжатие. Для этого режима у ParallelOptions есть еще одно свойство — AvailableMemorySize. Для любого другого режима это бессмысленно. Грубо говоря, это верхний предел выделяемой памяти при сжатии записей всеми ядрами процессора в мегабайтах. Aspose.ZIP использует это число для оценки максимального размера записи, которую можно безопасно сжимать параллельно. Записи, превышающие пороговое значение, подлежат последовательному сжатию. AvailableMemorySize — палка о двух концах: слишком высокая установка с огромными записями может привести к нехватке оперативной памяти, интенсивная замена и даже может быть исключение из памяти. Если установлено слишком низкое значение, большинство записей будут сжиматься последовательно без особого ускорения. Таким образом, опытные пользователи могут назначить его, учитывая компромисс.
Мы рекомендуем вам поэкспериментировать с различными режимами параллельного сжатия ваших типичных данных, чтобы определить, какие настройки лучше всего подходят для вашего случая.

Другие поддерживаемые функции Aspose.ZIP для .NET API

Используйте библиотеку Aspose.ZIP C# для преобразования, объединения, редактирования документов в виде zip-файлов, извлечения данных из архивов и многого другого!

  

Support and Learning Resources

  
  

Aspose.Zip offers individual archive processing APIs for other popular development environments, listed below: