簡體   English   中英

使用XMLTextReader進行大型XML讀取非常慢

[英]Large XML reading using XMLTextReader is very slow

我想認為我的問題不是很獨特,因為我的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;
    }

好像您正在將每個實體都保存到數據庫中。 這可能會很慢,尤其是當您必須打開連接,保存數據然后再次關閉連接時。

我建議嘗試在一次批量更新中包裝所有實體更改,因此您只需要打開與數據庫的連接並寫入一次即可。 您可以將所有實體添加到DataTable ,然后在完成處理后執行AcceptChanges(); 這將為您節省大量時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM