Как я могу улучшить производительность моего приложения, которое генерирует XML, используя Linq-to-Entities и XElement - PullRequest
0 голосов
/ 12 октября 2011

Я создал приложение, которое генерирует большой XML-файл, используя Linq-to-Entities и XElement. Это занимает целое ядро ​​нашего сервера 2 ГГц примерно за полчаса и использует ~ 1 ГБ памяти.

Я выполняю следующие виды работ:

var xml = from x in dbContext.Table1
          select new XElement("Table1",
                     new XElement("Field1", x.Field1),
                     new XElement("Field2", x.Field2),
                     new XElement("Field3", x.Field3),
                     new XElement("MoreFields",
                         new XElement("FieldA", x.MoreFields.FieldA),
                         new XElement("FieldA", x.MoreFields.FieldA),
                         new XElement("FieldA", x.MoreFields.FieldA.DoSomeWorkWithThisField())
    )
);

У меня есть другой уровень глубины или два, и некоторые поля работали как разбор int из строки, используя RegEx.Match()

У кого-нибудь есть рекомендации по оптимизации или рефакторингу? Я пытался использовать XStreamingElement, но, похоже, это не имело никакого значения.

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Похоже, что вы получаете Table1 несколько раз.

Можете ли вы получить его на List<T>, а затем использовать его несколько раз?

var list = dbContext.Table1.ToList();
var xml = new XElement("Table1",
    new XElement("Field1", list.Field1),
    new XElement("Field2", list.Field2),
    new XElement("Field3", list.Field3),
    new XElement("MoreFields",
        new XElement("FieldA", list.MoreFields.FieldA),
        new XElement("FieldA", list.MoreFields.FieldA),
        new XElement("FieldA", list.MoreFields.FieldA.DoSomeWorkWithThisField())
    )
);

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

Насколько большой документ вы генерируете, и сколько памяти у вашей машины? Возможно, вы захотите посмотреть на счетчики производительности - возможно, вы тратите большую часть времени на сборку мусора.

0 голосов
/ 12 октября 2011

Для больших документов следует рассмотреть потоковое решение, например XmlWriter, а не решение, например XDocument, которое сохраняет все данные в памяти.

...