Как разрешить System.Исключение OutOfMemoryException при загрузке большого XML-файла

#c# #.net #xml #winforms

#c# #.net #xml #winforms

Вопрос:

В моей программе есть этот код, который фактически загружает файлы размером 500 МБ и выше.

 XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
reader.Close();
  

Я получаю такого рода ошибку и не знаю, как решить проблему. Пожалуйста, пришлите мне несколько советов.

Комментарии:

1. Возможно, вам потребуется переключиться на анализатор XML на основе потока.

2. И / или переключиться на фактическую загрузку XML-файлов меньшего размера.

3. @Matt можете ли вы показать мне несколько кодов о том, как это сделать?

Ответ №1:

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

Этот простой пример начнется с чтения файла построчно, предоставляя XmlReader для каждой строки.

 using (var rdr = XmlReader.Create(new StreamReader("File.xml")))
{
    while (rdr.Read())
    {
        //do what you will with the line
    }
}
  

Смотрите методы и свойства, доступные при использовании XmlReader, в свойствах XmlReader (MSDN)

Комментарии:

1. в дополнение к приведенным выше кодам у меня есть следующие: XmlTextReader myTextReader = новый XmlTextReader(txtFileName.Text); myTextReader. Обработка пробелов = WhitespaceHandling. Нет; while (myTextReader.Read()) { foreach (узел XmlNode в xmlDoc) { TreeNode TreeNode = XmlNode2TreeNode(myTextReader, myTextReader.p); TreeNode. Text = FormatName(узел); treeView1.Nodes. Добавить (TreeNode); } }

2. добавлен элементарный пример для ответа, mingzcky.

Ответ №2:

вам нужно что-то вроде SAX, но для .NET.

http://sourceforge.net/projects/saxdotnet / или XmlReader, в основном анализатор на основе потока.

HTH