2013-11-18 4 views
0

У меня есть программа, которая строит большую структуру на основе xml в классы и удерживает их в коллекции, которая будет сериализована ... назовите их контрактами. Каждый контракт входит в коллекцию и состоит из объектов, которые будут представлять узлы в документе XML. Это все хорошо и денди, но теперь мы собираем 10000 предметов в коллекции. Диспетчер задач все еще ставит нас на 586 мегабайт использования на 8-гигабайтной машине.Сериализация OutOfMemoryException

Проблема возникает, когда я сериализации вниз к файлу:

 XmlSerializer serializer = new XmlSerializer(typeof(PolicyExtract)); 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("ent", "http://xxxxxx.com/V2.0/enrollmententities"); 

     StreamWriter fs = new StreamWriter(filePath); 
     serializer.Serialize(fs, this, ns); 

     fs.Close(); 

Это является класс или сама коллекция. Файл огромен (как и ожидалось), но недостаточно, чтобы взять всю память. В этот момент я получаю System.OutOfMemoryException, и файл вообще не создается.

Итак, чтобы воспроизвести, я пытаюсь сериализовать большую коллекцию (все еще хорошо в пределах памяти) в файл и получать OutOfMemoryException и без файла.

Любые идеи?

+0

32-битный процесс, даже на 64-битной машине, сможет получать максимум 3 ГБ - убедитесь, что вы выполняете этот процесс как 64-битный. – Oded

+0

... и только 2 ГБ на экземпляр объекта, даже на 64-битной машине. – ken2k

+0

@Own 2GB или 3GB? –

ответ

0

У нас были аналогичные проблемы в обратном направлении при десериализации больших файлов XML (> 1,4 ГБ). Мы также испытали OutOfMemoryExceptions задолго до того, как был достигнут предел процесса.
Мне также нравится XML-сериализация для его простоты, но в случае больших объемов данных требуется больше контроля над процессом сериализации, поскольку обработка XML обычно связана с большим количеством строк, созданных в памяти.
Мы смогли решить наши проблемы с XmlReader и позвонили по номеру GC.Collect после нескольких тысяч итераций. В вашем случае, используя XmlWriter для записи данных и метания в GC.Collect после некоторых итераций также должен облегчить проблему. Как часто вам нужно вызывать сборщик мусора, зависит от вашего сценария и может быть связано с некоторыми проб и ошибок. Не называйте это слишком часто, так как это тяжелая операция.
Кроме того, вы должны проверить свои структуры данных, есть ли дубликаты данных, которые вы могли бы заменить методами.
Даунсайд, конечно, что код сериализации становится намного дольше и менее прост в обращении, поскольку вам может потребоваться отразить изменения в структурах данных также в коде сериализации.

-2

Перейти к вашим свойствам проекта -> вкладка сборки -> Цель платформы: изменить «Любой процессор» на «x64».

+0

Это не работает, даже вызывает исключение. –

+0

Для этого вам нужна 64-битная инфраструктура. Было бы полезно узнать, какое исключение вы получите ... – user1073075

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