Лучший подход для записи огромных данных XML в файл? - PullRequest
3 голосов
/ 20 апреля 2010

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

_XmlTextWriterObject = new XmlTextWriter(_xmlFilePath, null);

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

EDIT

Извините, что я не смог передать то, что хотел сказать. Спасибо Эшу за указание. Я действительно буду использовать 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 ]

9 голосов
/ 20 апреля 2010

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

Помните, что XmlWriter реализует IDisposable, поэтому сделайте следующее:

using (XmlWriter _XmlTextWriterObject = XmlWriter.Create(_xmlFilePath))
{
   // Code to do the write here
}
4 голосов
/ 20 апреля 2010

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

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

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

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

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

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

2 голосов
/ 20 апреля 2010

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

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

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

...