簡體   English   中英

讀取/寫入C#中的大型XML文件

[英]Read/Write Large XML Files in C#

我正在使用XML數據庫開發應用程序。 我有很大的XML文件,必須在其中讀寫數據。 問題是由於性能問題,我不想將整個XML文件加載到內存中,也不想遍歷整個文件。 因為如果我將整個文件加載到內存中,這將影響應用程序性能,並且可能由於內存韭蔥而使應用程序崩潰。

我需要一種足夠的方法來將XML寫入和讀取到文件中,這不會影響性能和內存。

任何幫助將不勝感激。

如果這個XML決定不是您的決定,那么您就必須應對(請參閱整個MSDN示例http://msdn.microsoft.com/zh-cn/library/bb387013.aspx

static IEnumerable<XElement> StreamCustomerItem(string uri)
{
    using (XmlReader reader = XmlReader.Create(uri))
    {
        XElement name = null;
        XElement item = null;

        reader.MoveToContent();
        while (reader.Read())
        {
            if (reader.NodeType == XmlNodeType.Element)
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        name = XElement.ReadFrom(reader) as XElement;
                        break;
                    }
                }

                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        item = XElement.ReadFrom(reader) as XElement;
                        if (item != null) 
                        {
                            XElement tempRoot = new XElement("Root", new XElement(name));
                            tempRoot.Add(item);
                            yield return item;
                        }
                    }
                }
            }
        }
    }
}

但是,如果您控制決定,請您不要理會XML。 有多種選擇可以幫助您和您的應用程序正常運行,而不會帶來太多麻煩。

  1. SQL Compact。 Microsoft提供的簡便好用的SQL方法,不需要SQL Server實例。 http://www.microsoft.com/zh-CN/sqlserver/editions/2012-editions/compact.aspx
  2. SQL Lite。 適用於.net甚至Windows 8應用程序,簡單而穩定。 http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

您甚至可以使用MySQL,MariaDB或任何類似的東西!

看看這個,它將為您提供有關快速讀取xml的一些想法。 http://msdn.microsoft.com/zh-CN/library/system.xml.xmltextreader.aspx

已經有一些關於在stackoverflow中寫入xml文件的線程。

如何在C#中將(大)XML寫入文件?

但是,我認為如果您正在尋找非常好的性能,那么某些數據庫解決方案(例如sqlserver,mongodb)可能是一個更好的選擇

使用此鏈接

使用XmlReader ,它是允許我們僅將當前記錄存儲到內存中的一種不錯的選擇,它可以極大地提高性能。

編輯:切勿使用Load方法,它將整個XML文件加載到內存中,如果此文件很大,不僅查詢可能需要很長時間才能執行,而且可能會耗盡內存。

性能在一定程度上取決於您的應用程序所運行的.NET版本。 另一個快速參考是Microsoft模式和實踐文章

有4種方法:XMLDocument,XPathNavigator,XmlTextReader,Linq到XML,我認為它們之間的差異很有價值!

XmlDocument

它代表XML文件的內容。 從文件加載文件時,您會將整個文件讀入內存。 一般來說,如果您使用的是XmlDocument,則XML解析會慢得多,而XmlDocument更適合於將整個DOM加載到RAM中……您的應用程序的內存消耗可能就像毛毛蟲的移動方式一樣!

使用DOM模型和XmlDocument或XPathDocument類來解析大型XML文檔可能對內存有很大的要求。 這些需求可能會嚴重限制服務器端Web應用程序的可伸縮性。

XPath或LINQ-To-XML

如果您更關注性能,我個人不建議使用XPath或LINQ-To-XML查詢。 XPathNavigator提供了用於瀏覽和編輯XML數據的游標模型。

XmlReader

與XmlDocument相比,它可能有助於獲得更好的性能。 正如其他人已經建議的那樣。 XmlReader是一個抽象類,並提供API用於XML數據流的快速,只讀,只讀解析……它可以從文件,互聯網位置或任何其他數據流中讀取。 從文件讀取時,您不會一次加載整個文檔。 這就是它的亮點。

XmlTextReader :XmlTextReader,是XmlReader的實現。 使用XmlTextReader以向前,只讀的方式快速處理XML數據,而無需使用驗證,XPath和XSLT服務。

EOL規范化始終在XmlReader.Create的XmlReader中啟用,這會影響XDocument。 默認情況下,XmlTextReader上的規范化處於關閉狀態,這會影響XmlDocument和XmlNodeReader。 可以通過Normalization屬性將其打開。

設計注意事項

  • 考慮驗證大型文檔
  • 使用流接口
  • 考慮硬編碼的轉換
  • 考慮元素和屬性名稱的長度(!)
  • 考慮使用XmlNameTable: https ://msdn.microsoft.com/zh-cn/library/system.xml.xmlnametable%28v=vs.110%29.aspx

基准測試

暫無
暫無

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

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