Лучше инструмент gzip, чем SharpZipLib для Windows Mobile? - PullRequest
1 голос
/ 13 февраля 2010

Я использую SharpZipLib для gzip в Windows Mobile приложении, написанном на c #

У меня есть этот код

public static bool gzDecompressFile(String inputFilePath, String outputFilePath)
        {
            if (!File.Exists(inputFilePath))
                return false;

            if (File.Exists(outputFilePath))
                File.Delete(outputFilePath);


            FileStream fs = File.OpenRead(inputFilePath);
            FileStream fsOut = File.OpenWrite(outputFilePath);

            GZipInputStream gzipIn = new GZipInputStream(fs);

            // Compress file in 1kb chunks
            byte[] chunk = new byte[1024];
            int read = 1;

            while (read > 0)
            {
                read = gzipIn.Read(chunk, 0, chunk.Length);

                if (read > 0)
                {
                    fsOut.Write(chunk, 0, read);
                }
            }

            fsOut.Close();
            fs.Close();

            return true;
        }

Для декомпрессии 1,6 МБ -> 7 МБ требуется 4-5 минут.
Вы знаете лучший вариант для Compact Framework ?

Ответы [ 3 ]

2 голосов
/ 23 февраля 2010

Распаковка от 1,6 МБ до 7 МБ в течение более 4 минут ужасно медленная.

Некоторые вещи, которые приходят на ум:

  1. Вы пытались изменить размер вашего рабочего буфера? 1KB ИМХО очень консервативно. Возможно, вы столкнулись с проблемой производительности алгоритма распаковки GZip (но это всего лишь WAG).
  2. Есть ли временные файлы, которые хранятся, и если да, то где? Они в памяти или на запоминающем устройстве? А если на запоминающем устройстве, то как они могут иметь разные характеристики производительности.
  3. Вы можете улучшить свою производительность с помощью двойной буферизации. Это работает путем создания двух буферов, и в то время как один заполняется из чтения, другой сбрасывается записью (эффект пинг-понга, требуется асинхронный код). Это будет так же быстро, как самая медленная операция (чтение распакованного потока), но вы можете почти исключить накопленную задержку записи.

Изначально мы начали с SharpLibZip, но переключились на коммерческую библиотеку Xceed ZIP.NET , чтобы воспользоваться возможностями пакетной обработки (и поддержкой .NET и .NET Compact Frameworks). Библиотека Xceed также поддерживает GZip. Даже на наших устаревших устройствах Windows CE 4.2 с тактовой частотой 400 МГц для распаковки файла размером 6 МБ (хотя и в формате ZIP с использованием XCeed ZIP.NET) нам требуется всего около 20-30 секунд.

Кроме того, если я не ошибаюсь, я считаю, что .NET Compact Framework поддерживает GZip. На заметку: поместите ваши FileStream в использование операторов, чтобы убедиться, что они закрыты в случае возникновения исключения в середине вашего метода.

1 голос
/ 16 февраля 2010

Сжатие сильно загружает процессор. Может быть, это ... это просто, сколько времени это займет.

Попробуйте DotNetZip - не уверен, что быстрее, но он бесплатный, его легко попробовать. В DotNetZip есть GZipStream, который заменяет GZipStream в .NET BCL.

Поскольку вы выполняете GZIP, а не ZIP, вам нужен только Ionic.Zlib.dll, а не Ionic.Zip.dll. Первое является строгим подмножеством второго.


РЕДАКТИРОВАТЬ : пример кода

using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress))
{
    using (var raw = System.IO.File.Create(outputFile))
    {
        using (Stream compressor = new GZipStream(raw, CompressionMode.Compress))
        {
            byte[] buffer = new byte[WORKING_BUFFER_SIZE];
            int n;
            while ((n= input.Read(buffer, 0, buffer.Length)) != 0)
            {
                compressor.Write(buffer, 0, n);
            }
        }
    }
}

(GZipStream в приведенном выше коде предоставляется Ionic.Zlib.dll.)

0 голосов
/ 13 февраля 2010

Я использую компонент ZIP как часть Resco Mobile Toolkit: http://www.resco.net/developer/mobileformstoolkit/overview.aspx

Цена инструментария, вероятно, непомерно высока - зависит от того, нужен ли вам какой-либо другой элемент управления.

...