Паралельна композиція ZIP-архівів
Огляд
API Aspose.ZIP надає можливість створювати ZIP-архіви. Оскільки записи такого архіву можна стискати незалежно, можна певною мірою розпаралелювати створення архіву.
ZIP багатопотоковий: пояснення
Використовуйте ParallelOptions, щоб вказати, що архів потрібно підготувати з кількома ядрами ЦП.
Параметр ParallelCompressInMemory вказує на стратегію, яку ми вибираємо для багатозадачності. Ось три варіанти:
ParallelCompressionMode.Never
: стиснення всіх записів є послідовним. Лише одне ядро ЦП працює над стисненням і очищає стиснені дані по мірі надходження.ParallelCompressionMode.Always
: примусово стискає записи в різних потоках незалежно від розміру запису, доступної пам’яті та інших факторів. Кожне ядро процесора одночасно стискає файл, зберігаючи стислі дані в оперативній пам’яті. Після стиснення запису він передається в потік результатів. Якщо ваш обсяг оперативної пам’яті невеликий, а загальний розмір деяких N записів (де N — кількість ядер ЦП) величезний, може статися, що вся доступна для CLR оперативна пам’ять вичерпається та виникне OutOfMemoryExcepton.ParallelCompressionMode.Auto
: інтелектуальний режим. Він оцінює ядра ЦП, розміри записів, доступну пам’ять і вибирає, чи потрібно стискати записи паралельно чи послідовно. У цьому режимі деякі менші записи стискаються паралельно, а інші – послідовно. Записи LZMA не стискаються паралельно через високе споживання пам’яті. Загалом можна безпечно використовувати цей варіант, Aspose.ZIP обережно ставиться до оцінок і перемикається на послідовне стиснення як запасний варіант. Є ще одна властивість ParallelOptions для цього режиму - AvailableMemorySize. Це безглуздо для будь-якого іншого режиму. Грубо кажучи, це максимальна межа виділеної пам’яті під час стиснення записів усіма ядрами ЦП у мегабайтах. Aspose.ZIP використовує це число для оцінки найбільшого розміру запису, який безпечно стискати паралельно. Записи, що перевищують порогове значення, потрібно стискати послідовно. AvailableMemorySize — це палка з двома кінцями: надто високий розмір із величезними записами може призвести до виснаження оперативної пам’яті, інтенсивного обміну та навіть до виключення браку пам’яті. Якщо встановлено занадто низький рівень, більшість записів буде стиснуто послідовно без особливого прискорення. Отже, досвідчені користувачі можуть призначити його з урахуванням компромісу.
Ми рекомендуємо вам пограти з різними режимами паралельного стиснення типових даних, щоб визначити, які параметри є найкращими у вашому випадку.
Як створити 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 }