使用XMLTextReader进行大型XML读取非常慢

时间:2018-10-22 15:12:01

标签: c# xml-parsing xmltextreader

我想我的问题不是很独特,因为我的XML文件只有3MB。 XML中有近6万条记录。我很难减少处理时间。目前,读取和插入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 :(得分:1)

似乎您正在将每个实体保存到数据库中。这可能会很慢,特别是如果您必须打开连接,保存数据然后再次关闭连接时。

我建议尝试在一次批量更新中包装所有实体更改,因此您只需要打开与数据库的连接并写入一次即可。您可以将所有实体添加到DataTable,并在完成处理后执行AcceptChanges();。这样可能会为您节省大量时间。