Большое чтение XML с использованием XMLTextReader очень медленное - PullRequest
0 голосов
/ 22 октября 2018

Мне нравится думать, что моя проблема не очень уникальна, поскольку размер моего XML-файла составляет всего 3 МБ.В XML около 60 тысяч записей.Я с трудом сокращаю время обработки.В настоящее время чтение и вставка в Datatables занимает около 7-8 минут.(Обратите внимание, что я НЕ вставляю в базу данных, поэтому транзакции с базой данных здесь не являются проблемой)

Вот код, который я написал.Будем очень благодарны за любые предложения по сокращению времени обработки.

 XmlTextReader reader = new XmlTextReader(destFile);            

        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    if (reader.Name == "Report")
                    {                           
                        FileDataTable = UpdateReportTable(FileDataTable, reader);

                    else if (reader.Name == "Name")
                    {
                        NameTable = UpdateNameTable(NameTable, reader);
                    }

                    else if (reader.Name == "Entries")
                    {
                        EntriesTable = UpdateEntriesTable(EntriesTable , reader);
                    }                     

                    reader.MoveToElement();
                    break;
                case XmlNodeType.Text:
                    break;
                case XmlNodeType.EndElement:
                    break;
            }
        }

Тогда у меня есть следующая функция для получения значения в DataTable.Элемент «Записи» занимает 90% времени, поэтому я публикую этот код, остальные функции аналогичны.

private static DataTable UpdateEntriesTable(DataTable entries, XmlTextReader reader)
    {
        DataRow row = entries.NewRow();

        for (int attInd = 0; attInd < reader.AttributeCount; attInd++)
        {
            reader.MoveToAttribute(attInd);
            if (reader.Name == "refDataId") { row["DataId"] = Convert.ToInt32(reader.Value); }

        }

        reader.MoveToElement();
        reader.Read();
        row["DataCount"] = Convert.ToInt32(reader.Value);
        row["LastModifiedOn"] = DateTime.Now;
        try
        {
            entries.Rows.Add(row);
            entries.AcceptChanges();
        }
        catch (Exception ex)
        {
            log.Error(ex.Message);
            return entries;
        }
        return entries;
    }

1 Ответ

0 голосов
/ 22 октября 2018

Похоже, что вы сохраняете каждую сущность в базу данных по ходу работы.Это может быть довольно медленно, особенно если вам нужно открыть соединение, сохранить данные, а затем снова закрыть соединение.вам нужно только открыть соединение с базой данных и написать в нее один раз.Вы можете добавить все свои объекты в DataTable, и после завершения обработки выполнить AcceptChanges();.Это, скорее всего, сэкономит вам массу времени.

...