Есть ли способ объединить два XmlDocument, не удерживая первый в памяти?
Мне приходится перебирать список до сотни больших (~ 300 МБ) файлов XML, добавляя к каждому до 1000 узлов, повторяя весь процесс несколько раз (поскольку новый список узлов очищается для экономии памяти). В настоящее время я загружаю весь XmlDocument
в память перед добавлением новых узлов, что в настоящее время невозможно.
Что бы вы сказали, это лучший способ сделать это? У меня есть несколько идей, но я не уверен, что лучше:
- Никогда не загружайте весь
XMLDocument
, вместо этого используйте одновременноXmlReader
иXmlWriter
для записи во временный файл, который впоследствии переименовывается. - Создайте
XmlDocument
только для новых узлов, а затем вручную запишите его в существующий файл (т.е.file.WriteLine( "<node>\n" )
- Что-то другое?
Любая помощь будет высоко ценится.
Изменить Еще немного подробностей в ответ на некоторые комментарии:
Программа анализирует несколько больших журналов в формате XML, группируя их в разные файлы по источнику. Его нужно запускать только один раз в день, и после того, как XML написан, есть легкая проприетарная программа чтения, которая дает отчеты о данных. Программе нужно запускаться только один раз в день, поэтому она может быть медленной, но работает на сервере, который выполняет другие действия, в основном сжатие и передачу файлов, на которые нельзя слишком сильно повлиять.
База данных, вероятно, была бы проще, но компания не собирается делать это в ближайшее время!
Как есть, программа работает на машине разработчика, используя максимум несколько ГБ памяти, но выдает исключения из памяти при запуске на сервере.
Окончательное редактирование Задача имеет довольно низкий приоритет, поэтому получение базы данных потребует дополнительных затрат (хотя я рассмотрю монго).
Файл будет только добавлен и не будет расти бесконечно — каждый окончательный файл предназначен только для дневного журнала, а на следующий день создаются новые файлы.
Я, вероятно, буду использовать метод XmlReader/Writer, так как проще всего обеспечить достоверность XML, но я принял во внимание все ваши комментарии/ответы. Я знаю, что такие большие XML-файлы — не очень хорошее решение, но это то, чем я ограничен, поэтому спасибо за всю оказанную помощь.
File.Replace
старого файла с временным файлом. Это сохраняет ваши данные, если во время манипуляций что-то пойдет не так. - person Dour High Arch   schedule 03.08.2012