Сериализация XML и как она обрабатывает запись в файл - PullRequest
0 голосов
/ 20 апреля 2011

Я искал повсюду и не смог найти решение своей проблемы.

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

Этот процесс взрывает только одного из наших клиентов, у которого около 450 000 записей. Мы перебираем коллекцию учетных записей и создаем объект класса, который затем передается в сериализатор xml. Этот объект имеет несколько свойств и методов, которые не все будут заполнены одновременно. Эти объекты заполняются на основе информации в каждой записи учетной записи.

Я проверил, как мы вызываем конструктор для XML-сериализатора, и он находится в формате, который будет хранить сборку xml и не создавать новые каждый раз. Поэтому я не верю, что из-за создания динамических сборок происходит утечка памяти.

Как мы называем сериализатор: Dim k1Serializer As New XmlSerializer (GetType (ClassObject)) *

Мои вопросы:

При сериализации большого объекта смотрит ли сериализатор на все возможные сериализуемые объекты или только те, которые заполнены вашим объектом?

Может ли проблема с сериализацией этого большого объекта класса вызвать проблему?

Я заметил, что когда мы передаем сериализованный объект, он не записывается автоматически в указанный файл. Я полагаю, что сериализация объекта занимает несколько секунд, а затем записывает его. Может ли тот факт, что мы перебираем так много записей, так быстро, что сериализатору не хватает времени записать в файл и затем освободить память?

Я действительно в своем уме, и любая помощь будет оценена. Пожалуйста, дайте мне знать, если требуется какая-либо другая информация.

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 апреля 2011

Рассмотрим XmlTextWriter . Вы можете вручную записать данные XML для своих данных, не прибегая к чёрному ящику, который является XmlSerializer.

Простой пример итерации списка элементов и их записи в файл XML:

var settings = new System.Xml.XmlWriterSettings
{
    OmitXmlDeclaration = true,
    Indent= true
};    
string myXmlNamespace = "urn:myXmlNamespace";
using (var fileStream = 
    new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None))
{
  using (XmlWriter w = XmlWriter.Create(fileStream, settings)) 
  {
    w.WriteStartElement("root", myXmlNamespace);
    for (var elt in myCollection) 
    {
      w.WriteStartElement("elt",myXmlNamespace);
      w.WriteElementString("prop1",myXmlNamespace,elt.Property1); 
      w.WriteElementString("prop2",myXmlNamespace,elt.Property2);
      w.WriteEndElement();
    }
  }
}

Вы должны сделать обратное для "десериализации". Откройте файловый поток, затем используйте XmlTextReader () для чтения XML и создайте экземпляры элементов для добавления в вашу коллекцию.

0 голосов
/ 20 апреля 2011

Одновременная загрузка 450 000 записей в память только для записи в XML-файл не является для меня хорошей идеей. Я бы посоветовал вам перестроить функциональность, используя XMLWriter вместо XML Serializer, чтобы весь набор информации не хранился в памяти одновременно.

...