Лучший способ сжать (то есть лучшую комбинацию степени сжатия и скорости) каталог больших файлов (каждый ч / б 100-300 МБ) в C #? - PullRequest
1 голос
/ 11 ноября 2011

Я пишу консольное приложение для сжатия каталога больших файлов (около 30) с каждым файлом размером около 100-300 МБ, что будет выполняться один раз в день (по мере поступления новых файлов). Я попытался использовать встроенный класс GZipStream, и это заняло около 15 секунд на файл с коэффициентом сжатия около 0,212. Мне было интересно, есть ли более эффективный выход со сторонними библиотеками или есть какой-то способ увеличить степень сжатия. Наконец, есть ли возможность многопоточности ускорить этот процесс?

Вот код, который я сейчас использую (в основном это из статьи MSDN на GZipStream)

private void CompressFile(FileInfo fileInfo)
{
    // Get the stream of the source file.
    using (FileStream inFile = fileInfo.OpenRead())
    {
        Timer.Reset();

        // Prevent compressing hidden and 
        // already compressed files.
        if ((File.GetAttributes(fileInfo.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileInfo.Extension != ".gz")
        {
            // Create the compressed file.
            using (FileStream outFile = File.Create(fileInfo.FullName + ".gz"))
            {
                using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress))
                {
                    // Copy the source file into 
                    // the compression stream.
                    Timer.Start();
                    inFile.CopyTo(Compress);
                    Timer.Stop();

                    Console.WriteLine("Compressed {0} from {1} to {2} bytes in {3} seconds.",
                        fileInfo.Name, fileInfo.Length.ToString(), outFile.Length.ToString(), ((double)Timer.ElapsedMilliseconds / 1000));
                }
            }
        }
    }
}

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Этот ответ: Безопасно ли параллельно вызывать ICsharpCode.SharpZipLib для нескольких потоков

дает некоторые сравнения альтернатив сжатия GZIP.

Ваши данные достаточно велики, чтобы вы могли выиграть от параллельного сжатия.

Этот пример кода выполняет параллельное сжатие.

По сравнению со встроенным GZipStream, параллельный подход занимает примерно половину времени и обеспечивает "немного лучшее" сжатие.

DotNetZip также имеет классы для сжатия BZip2 (включая параллельную реализацию). BZip2 намного медленнее, чем GZIP, но дает вам лучшую степень сжатия.

1 голос
/ 11 ноября 2011

Универсального пути нет. Вы должны профилировать его для

  • Полезная нагрузка
  • файловая система
  • Загрузка и емкость процессора

Вы можете передать параметр Level в конструктор GZipStream

Я бы подумал об использовании уже существующих (внешних) инструментов для выполнения этой работы. Вы будете намного быстрее с сравнительными тестами, потому что вам не нужно идти и внедрять их. Я бы действительно предложил инструменты, подобные Unix, но у вас могут возникнуть проблемы с поиском их для вашей платформы Windows

...