Лучший подход для записи огромных данных XML в файл?

В настоящее время я экспортирую таблицу базы данных с огромными данными (более 100000 записей) в файл xml с использованием класса XmlTextWriter и пишу непосредственно в файл на физическом диске.

_XmlTextWriterObject = new XmlTextWriter(_xmlFilePath, null);

Хотя мой код работает нормально, мой вопрос в том, что это лучший подход? Должен ли я вместо этого записать весь XML в потоке памяти, а затем записать XML-документ в физическом файле из потока памяти? И как влияют на память / производительность в обоих случаях?

РЕДАКТИРОВАТЬ

Извините, что я не смог передать то, что хотел сказать. Спасибо Эшу за указание. Я действительно буду использовать XmlTextWriter, но я хотел сказать, передавать ли физическую строку пути к файлу конструктору XmlTextWriter (или, как предположил Джон, XmlTextWriter.Create() метод) или использовать потоковый API. Мой текущий код выглядит следующим образом:

XmlWriter objXmlWriter = XmlTextWriter.Create(new BufferedStream(new FileStream(@"C:\test.xml", FileMode.Create, System.Security.AccessControl.FileSystemRights.Write, FileShare.None, 1024, FileOptions.SequentialScan)), new XmlWriterSettings { Encoding = Encoding.Unicode, Indent = true, CloseOutput = true });
using (objXmlWriter)
{
   //writing xml contents here
}

3 ответа

Решение

Хотя мой код работает нормально, мой вопрос в том, что это лучший подход?

Как уже упоминалось и ваше обновление, XmlWriter.Create Это хорошо.

Или мне сначала записать весь поток XML в памяти, а затем записать документ XML в физический файл из потока памяти?

У вас есть память, чтобы записать весь файл в память? Если вы сделаете это, то этот подход будет быстрее, в противном случае потоковая передача с использованием FileStream который позаботится об этом за вас.

И как влияют на память / производительность в обоих случаях?

Чтение всего XML-файла потребует больше памяти и увеличит загрузку процессора. Потоковая передача на диск будет использовать больше процессора. Но вам нужно будет использовать огромный файл, чтобы это было заметно даже на настольном оборудовании. Если вы беспокоитесь о том, что в будущем размер увеличится еще больше, придерживайтесь FileStream Техника, чтобы доказать это.

Эмпирическое правило заключается в использовании XmlWriter когда документ нужно только написать и не работать с в памяти, и использовать XmlDocument (или DOM), где вам нужно работать с ним в памяти.

Помните, хотя, XmlWriter инвентарь IDisposableтак что сделайте следующее:

using (XmlWriter _XmlTextWriterObject = XmlWriter.Create(_xmlFilePath))
{
   // Code to do the write here
}

Как отметил Джон Сондерс, лучше использовать XmlWriter.Create(). Это рекомендация MSDN. Метод XmlWriter.Create () также может принимать объект XmlWriterSettings. Там вы можете настроить свое поведение совсем немного. Если вам не нужна проверка и проверка символов, вы можете отключить ее и получить немного большую скорость. Например

XmlWriterSettings settings = new XmlWriterSettings();
settings.CheckCharacters = false;
using (XmlWriter writer = XmlWriter.Create("path", settings))
{
    //writing code
    writer.Flush();
}

В противном случае я думаю, что все в порядке.

Другие вопросы по тегам