2010-04-22 3 views
0

Я пытаюсь сериализовать значительное количество двоичных данных в пользовательский формат файла, используя System.IO.Packaging.Package и PackagePart. Я пытаюсь использовать BinaryFormatter для вывода набора подробных наборов данных медицинских изображений в отдельные части файла/пакета.System.IO.Packaging проблемы скорости в C#

Я могу использовать BinaryFormatter для вывода всех моих данных непосредственно в FileStream (вообще не используя System.IO.Packaging), а мои данные образца выводят около 140 миллионов данных за 12 секунд. Довольно быстрое и не очень плохое решение, но я бы предпочел более гибкий формат, поддерживающий сжатие, и возможность хранить дополнительные данные в гибком формате.

Получение потока через _packagePart.GetStream() и попытку сериализации данных в этот поток через двоичные файлы. Моя сериализация данных займет около 5-10 минут (и это происходит при выключенном сжатии).

Класс System.IO.Packaging.Package - это нечто вроде черного ящика, с которым у меня нет существенного опыта. Любая идея, почему потоковая передача данных в этот формат против прямого бинарного форматирования в файл будет сильно отличаться в производительности? Я знаю, что мой объект может быть сериализован относительно быстро в двоичном формате. Почему так долго писать?

+0

возможно пост пример кода – Simon

ответ

2

Я попытался отключить сжатие (NotCompressed) с очень небольшой разницей в скорости. Но я, в конечном счете, нашел приемлемое решение.

Зная, что BinaryFormatter работает нормально, когда не переходит непосредственно в пакет, я вместо этого сначала сериализую данные в MemoryStream. Затем, используя функцию CopyStream ниже, я копирую MemoryStream в PackageStream.

public static void CopyStream(Stream input, Stream output) 
    { 
     byte[] buffer = new byte[32768]; 
     while (true) 
     { 
      int read = input.Read(buffer, 0, buffer.Length); 
      if (read <= 0) 
       return; 
      output.Write(buffer, 0, read); 
     } 
    } 

Это решение получает мою скорость сериализации до 10-15 секунд общих (по сравнению с 10 минут), и большая вещь, я могу включить опции Normal или High сжатия и получить сжатие около 50% от мои данные.

У меня нет большого ответа относительно того, почему это оказывает такое огромное влияние, но просто пыталось получить мой код в формате, который у меня был больше видимым на петлях, записывающих в Пакет, чтобы увидеть, могу ли я профиль это лучше.

Смежные вопросы