istudent Ответов: 2

Исключение типа "system.outofmemoryexception" было вызвано при чтении XML-файлов.


I am trying to read xml files and load the data to data base. 
While reading and adding xml file to list of object. 
I get 'System.OutOfMemoryException'. 
I could have more than 6000000 xml files which I am not sure

if possible please guide better way to optimize the code.


Что я уже пробовал:

foreach (var xml in xmlFiles)
           {

               try
               {
                   XmlRootAttribute xRoot = new XmlRootAttribute
                   {
                       ElementName = "CASE",
                       IsNullable = true
                   };

                   XmlSerializer xs = new XmlSerializer(typeof(MyTable), xRoot);
                   MyTable cs = new MyTable();

                   using (var sr = new StreamReader(xml))
                   {
                       cs = (MyTable)xs.Deserialize(sr);
                     //  cases.Add(cs);

                           LoadtToLocalDB(cs);

                   }


               }
               catch (Exception ex)
               {

                   using (var writer = new StreamWriter(errorLog, false))
                   {
                       writer.WriteLine(xml);
                       writer.WriteLine(ex.Message);
                       writer.WriteLine("----------------------------------------------------------------------------------");
                   }
               }
           }

2 Ответов

Рейтинг:
2

F-ES Sitecore

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

XmlReader.Метод Чтения (System.Xml) | Microsoft Docs[^]

Однако это будет означать полное изменение вашего кода.

Если ваш xml выглядит следующим образом (обратите внимание, что важно, чтобы у вас был только один корневой элемент)

<students>
	<student>
		<name>John Does</name>
		<age>14</age>
		<gender>MALE</gender>
		<class>8</class>
	</student>
	<student>
		<name>John Does 2</name>
		<age>24</age>
		<gender>FEMALE</gender>
		<class>9</class>
	</student>
</students>


Затем этот код будет в основном хранить значения ваших узлов в коллекции и обрабатывать их один за другим. Это консольное приложение в качестве примера;

static void Main(string[] args)
{
    XmlReader r = XmlReader.Create(@"c:\temp\test.xml");

    NameValueCollection values = null;
    string nodeName = null;

    while (r.Read())
    {
        if (r.NodeType == XmlNodeType.Element)
        {
            if (r.Name.Equals("student", StringComparison.CurrentCultureIgnoreCase))
            {
                ProcessStudent(values);

                values = new NameValueCollection();
            }
            else if (values != null)
            {
                nodeName = r.Name;
            }
        }
        else if (r.NodeType == XmlNodeType.Text && !string.IsNullOrWhiteSpace(nodeName))
        {
            values.Add(nodeName, r.Value);
        }
    }

    ProcessStudent(values);

    Console.ReadLine();
}

static void ProcessStudent(NameValueCollection values)
{
    if (values == null)
    {
        return;
    }

    foreach (string key in values.Keys)
    {
        Console.WriteLine(key + " = " + values[key]);
    }
}


istudent

мой xml-файл выглядит следующим образом


<студент>
<имя>Джон делает
<возраст>14
<пол>мужчина
<класс>8


как я могу прочитать это назначение моему объекту с помощью xml reader ? Приведенный выше пример xml очень прост. Дочерний узел в моем фактическом xml может содержать целые электронные письма, а что нет.

ZurdoDev

Просто google для примеров c# xml reader.

F-ES Sitecore

Я обновил решение

Рейтинг:
1

OriginalGriff

Начните с изучения деталей исключения и выяснения того, какой из ваших файлов создает проблему (предполагая, что каждый раз это один и тот же файл; если это не так, то вам нужно посмотреть, сколько файлов загружается и что происходит с ними в вашем другом коде).

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

Это, по крайней мере, должно дать вам ключ к пониманию того, почему вы получаете исключение.