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



我喜欢认为我的问题不是很独特,因为我的XML文件的大小只有3MB。XML 中有近 6 万条记录。我很难减少处理处理时间。目前,读取并插入数据表需要近 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;
}
}

然后我有以下函数将值获取到数据表中。 元素"条目"占用了 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;
}

看起来您正在将每个实体保存到数据库中。 这可能非常缓慢,特别是如果您必须打开连接,保存数据,然后再次关闭连接。

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

最新更新