C # десериализация O (n * n) поведение? - PullRequest
2 голосов
/ 24 января 2011

У меня есть сериализуемый класс (назовите его A), реализующий ISerializable.

Если я сериализую около 11K из них в массиве (в виде массива), для десериализации потребуется около 1,3 ГБ максимального размера виртуальной машины170 МБ образа диска в 250 МБ конечного размера виртуальной машины.Это занимает около 5 минут (истекшее время), 4: 20 минут (время ЦП).

Если я сериализую каждый из вышеупомянутых объектов 11K по отдельности в один и тот же файл (вместе с индикатором подсчета), десериализация занимает около 250 МБмаксимального размера виртуальной машины, чтобы прочитать немного меньший (160 МБ) образ диска в 250 МБ конечного размера виртуальной машины.Это занимает около 35 секунд (истекшее время), 20 секунд (время процессора).

Есть идеи, почему?Кажется страннымОба вышеупомянутых случая используют двоичную сериализацию.

PS Если это уместно, в экземплярах A есть несколько содержащихся сериализуемых объектов, каждый из которых является экземплярами классов, реализующих ISerializable.

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

В коде сериализации dot net есть ошибка, которая вызывает поведение N ^ 2: http://social.msdn.microsoft.com/Forums/en-US/netfxremoting/thread/442e95eb-683e-45c3-b84e-25b0b4037d75/#442e95eb-683e-45c3-b84e-25b0b4037d75

1 голос
/ 25 января 2011

Я бы предположил, что процесс инкрементальной сериализации занимает меньше времени, чем сериализация всего массива, поскольку этот инкрементный процесс создает недолговечные объекты.Т.е. когда каждая сериализация объекта завершена, на те объекты, созданные в процессе сериализации, больше нет ссылок, тогда как я представляю, что сериализация всего массива приводит к тому, что на несколько объектов ссылаются дольше.Сборщик мусора .net оптимизирован для объектов с коротким сроком службы, и многие из этих объектов в основном хранятся в кэше процессора до сбора 0.

Я бы порекомендовал получить профилировщик памяти и решить, в чем проблема.В прошлом я использовал профилировщик памяти ANTS и могу порекомендовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...