ZIPアーカイブの並列構成
概要
Aspose.ZIP API は、ZIP アーカイブを作成する機能を提供します。 このようなアーカイブのエントリは個別に圧縮できるため、アーカイブの作成をある程度並列化することができます。
ZIP マルチスレッド: 説明
ParallelOptions を使用して、アーカイブを複数の CPU コアで準備する必要があることを示します。
ParallelCompressInMemory の設定は、マルチタスクに選択する戦略を示します。 以下に 3 つのオプションがあります。
ParallelCompressionMode.Never
: すべてのエントリの圧縮は順次に行われます。 1 つの CPU コアのみが圧縮を処理し、圧縮データが到着するとフラッシュします。ParallelCompressionMode.Always
: エントリ サイズ、利用可能なメモリ、その他の要因に関係なく、異なるスレッドでエントリの圧縮を強制します。各 CPU コアは、圧縮データを RAM に保持しながらファイルを同時に圧縮します。エントリが圧縮されると、結果ストリームにフラッシュされます。 RAM の量が少なく、いくつかの N エントリ (N は CPU コアの数) の合計サイズが大きい場合、CLR に使用できるすべての RAM が使い果たされ、OutOfMemoryExcepton が発生する可能性があります。ParallelCompressionMode.Auto
: インテリジェント モード。 CPU コア、エントリのサイズ、利用可能なメモリを推定し、エントリを並行して圧縮するか順次圧縮するかを選択します。このモードでは、いくつかの小さなエントリは並行して圧縮され、他のエントリは順次圧縮されます。 LZMA エントリは、メモリ消費量が多いため、並列圧縮されません。一般に、このオプションを使用するのが安全ですが、Aspose.ZIP は推定に慎重であり、フォールバックとして順次圧縮に切り替えます。このモードには ParallelOptions のプロパティがもう 1 つあります - AvailableMemorySize。他のモードでは無意味です。大まかに言うと、すべての CPU コアでエントリを圧縮する際に割り当てられるメモリの上限 (メガバイト単位) です。 Aspose.ZIP は、その数値を使用して、並列圧縮しても安全なエントリの最大サイズを推定します。しきい値を超えるエントリは順次圧縮されます。 AvailableMemorySize は両刃の剣です。巨大なエントリで設定値が高すぎると、RAM の枯渇、激しいスワップが発生し、さらにはメモリ不足例外が発生する可能性があります。設定が低すぎると、ほとんどのエントリは、それほど高速化されずに順次圧縮されます。したがって、洗練されたユーザーは、トレードオフを考慮してそれを割り当てることができます。
一般的なデータに対してさまざまな並列圧縮モードを試して、ケースに最適な設定を決定することをお勧めします。
C# サンプルで並列圧縮を使用して ZIP アーカイブを作成する方法
手順: C# で並列圧縮を使用して ZIP アーカイブを作成する
FileMode.Create
でファイル ストリーム (FileStream
) を開き、新しい ZIP ファイル (archive.zip
) を作成します。- ZIP エントリを管理するための新しい
Archive
オブジェクトを初期化します。 CreateEntry
メソッドを使用して、「first.bin
」や「last.bin
」などの複数のエントリを追加し、File.OpenRead
を使用してソース ファイル (data1.bin
およびdata1.bin
など) から読み取ります。dataN.bin
)。ArchiveSaveOptions
をParallelOptions
で設定します。ここで、ParallelCompressInMemory
はParallelCompressionMode.Always
に設定され、アーカイブを高速化するための並列圧縮が有効になります。- 「Save」メソッドを使用して、指定したオプションを使用してアーカイブを保存します。
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 }