2015-10-17 3 views
2

Я пытаюсь написать xml в файл usng XDocument. Раньше я писал текстовый файл с использованием FileStream, и он работал быстро.Есть ли способ сделать XDocument Сохранить быстрее

Используя Profiler, я обнаружил, что XDcoument.Save занимает около 90% времени, особенно когда я пишу большой текст в узле xml.

XDocument xDocument = XDocument.Load(FilePath); 
      XElement root = xDocument.Element("logs"); 
      root.Add(
        new XElement(
         "log", 
         new XElement(
          "dt", 
          DateTime.Now.ToString("MMM dd, yyyy")), 
         new XElement(
          "tm", 
          DateTime.Now.ToString("HH:mm:ss.fff")), 
         new XElement(
          "st", 
          ConvertStackTrace(stackList) 
          //stackInfo 
          ), 
         new XElement(
          "t", 
          topic), 
         new XElement(
          "d", 
          description),        
         new XElement(
          "cu", 
          custom))); 
      xDocument.Save(FilePath); 

Есть ли другой способ написать xml в файл быстрее этого. Обратите внимание, что файл составляет около 1 МБ, и каждый раз, когда он открывает файл и добавляет к нему узел.

+1

Файл журнала будет продолжать увеличиваться, возможно, забываться и замедлять программу со временем. Я предлагаю открыть другой файл журнала на основе даты, ака 'StackLog20151017.xml' за 17 октября 2015 года. Если он написан много, то сделайте это также почасовым. Меньшие размеры будут экономить быстрее. –

+0

Да, я делаю это и имею возможность создавать новый файл на основе даты или размера файла. Проблема все еще остается. – Samuel

ответ

2

В основном есть три способа, как прецессия в XML-файл в .NET

  • XmlTextReader, XmlTextWriter - самый низкий уровень API для работы с файлами XML в .NET. Он обеспечивает потоковый доступ к данным xml.

  • XmlDocument - обеспечивает DOM представление XML, что позволяет легко читать/изменять данные

  • XDocument - обеспечивает DOM-представление XML и поддерживает LINQ к XML запросов

Оба XDocument и XmlDocument использует XmlReader/XmlWriter за сценой. Также оба хранят все данные в памяти, поэтому, очевидно, они медленнее и интенсивнее. Это мало что можно сделать, потому что каждый раз, когда вы вызываете свой код, весь XML-документ должен разбираться, а затем снова выгружаться на диск.

При переключении из XDocument в XmlReader/XmlWriter можно ожидать значительно более высокую производительность (дикие догадки 5x-10x быстрее), но это требует некоторой работы в качестве обработки документов с XmlReader/XmlWriter не так прост, как с XDocument

В зависимости от вашего варианта использования вы также можете использовать некоторые «неприятные» трюки, такие как запись только фрагмента xml для каждого журнала. Таким образом, вам не нужно анализировать документ, вы можете просто добавить фрагмент в конец файла. Скорость будет сопоставима с использованием обычного текстового файла. Недостаток - созданный файл недействителен XML, поскольку он не имеет ни одного корневого элемента. С таким файлом легко работать с таким файлом, но внешние программы, вероятно, не сработают.

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