1
Vote

How to achieve same compression speed

description

I am looking for a fast way to create a .zip archive of a directory that contains a lot of small files (e.g. 25.4 MB, 8 directories and 4505 files, but could be larger).

When I use the standard 7zip Installation (via context menu) the compression takes 1 to 2 seconds.

When I use the SevenZipCompressor from the SevenZipSharp library to do the same in a C# application, it takes way longer (> 5 seconds).

Now I am wondering what are the default parameters used by 7zip (or how could I find out, which parameters 7zip actually uses) and how can I set them in my code to achieve the same speed?

For my application, the compression level is not as important as the speed.

Here is my code (I tried different compression levels and modes, but with no significant differences):
public Compressor()
{
  var zipFile = @"pathTo7ZipDll\7z.dll";
  if (File.Exists(zipFile))
  {
    SevenZipBase.SetLibraryPath(zipFile);
  }
  else
  {
    throw new ApplicationException("seven zip dll file not found!");
  }

  Zipper = new SevenZipCompressor
  {
    ArchiveFormat = OutArchiveFormat.Zip,
    DirectoryStructure = true,
    PreserveDirectoryRoot = true,
    CompressionLevel = CompressionLevel.Fast,
    CompressionMethod = CompressionMethod.Deflate
  };


  Zipper.FileCompressionStarted += (s, e) =>
  {
    if (IsCancellationRequested)
    {
      e.Cancel = true;
    }
  };

  Zipper.Compressing += (s, e) =>
  {
    if (IsCancellationRequested)
    {
      e.Cancel = true;
      return;
    }

    if (e.PercentDone == 100)
    {
      OnFinished();
    }
    else
    {
      Console.WriteLine($"Progress received: {e.PercentDone}.");
    }
  };

  Zipper.CompressionFinished += (s, e) =>
  {
    OnFinished();
  };
}

private void OnFinished()
{
  IsProcessing = false;
  IsCancellationRequested = false;
}

public void StartCompression()
{
  IsProcessing = true;
  Zipper.CompressDirectory(InputDir, OutputFilePath);
}
The original directory has a size of 26.678.577 Bytes.

The compressed .zip created with the c# code is 25.786.743 Bytes.
The compression takes ~6167 ms.

The compressed .zip created with the 7zip installation is 25.771.350 Bytes.

comments