2010-11-25 35 views
3

私はXElementオブジェクトを持っています。このオブジェクトには約120MBのデータが含まれています。 XMLはそれぞれ約20KBの約6000個の要素で構成されています。XElement.ToString()によりSystem.OutOfMemoryExceptionが発生する

XElement.ToString()私はWebサービスでOuterXmlを返す必要があるので、私はXElement.ToString()に電話をかけようとしています。

私はSystem.OutOfMemoryExceptionを取得しています。

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
    at System.String.GetStringForStringBuilder(String value, Int32 startIndex, Int32 length, Int32 capacity) 
    at System.Text.StringBuilder.GetNewString(String currentString, Int32 requiredLength) 
    at System.Text.StringBuilder.Append(Char[] value, Int32 startIndex, Int32 charCount) 
    at System.IO.StringWriter.Write(Char[] buffer, Int32 index, Int32 count) 
    at System.Xml.XmlEncodedRawTextWriter.FlushBuffer() 
    at System.Xml.XmlEncodedRawTextWriter.WriteAttributeTextBlock(Char* pSrc, Char* pSrcEnd) 
    at System.Xml.XmlEncodedRawTextWriter.WriteString(String text) 
    at System.Xml.XmlEncodedRawTextWriterIndent.WriteString(String text) 
    at System.Xml.XmlWellFormedWriter.WriteString(String text) 
    at System.Xml.XmlWriter.WriteAttributeString(String prefix, String localName, String ns, String value) 
    at System.Xml.Linq.ElementWriter.WriteStartElement(XElement e) 
    at System.Xml.Linq.ElementWriter.WriteElement(XElement e) 
    at System.Xml.Linq.XElement.WriteTo(XmlWriter writer) 
    at System.Xml.Linq.XNode.GetXmlString(SaveOptions o) 
    at System.Xml.Linq.XNode.ToString() 

私はXmlDocumentで同じデータを持っているし、問題なくXmlDocument.OuterXmlを呼び出すことができます。また、XElement.Save()に電話して、XMLを問題なくファイルに保存することもできます。

メモリの消費量が少ないXElement.ToString()の代替案を誰にでも提案できますか?あるいは、より大きなメモリ空間を可能にするいくつかのパラメータを設定できますか?

+0

ウェブサービスで120MBのデータを返す必要があります。 – Phill

+0

これは私が考えていたものです。 –

+0

データを圧縮して返します。 – TalentTuner

答えて

4

の方法ではが多すぎます。 一般に raw XmlWriterは、この巻に最適なオプションです。ただし、Save()成功し、あなたはおそらく試みることができることができるかどうか:

string xml; 
    using(var sw = new StringWriter()) { 
     el.Save(sw); 
     xml = sw.ToString(); 
    } 

または多分:これらの

string xml; 
    using (var ms = new MemoryStream()) { 
     using(var tw = new StreamWriter(ms, Encoding.UTF8)) 
     { 
      el.Save(tw);    
     } 
     xml = Encoding.UTF8.GetString(ms.GetBuffer(), 0, (int)ms.Length); 
    } 

しかし、どちらか(あるいは両方)がまだ火花のシャワーで爆発する可能性があります。このタイプのシナリオ用に設計されたXStreamingElementを調べることもできますが、Webサービスの場合はxml-、特にがたくさんあります。代替(より高密度)の連載フォーマットの提案にはお答えしますか?

0

私は同じ問題がありました。

WCFサービスのtransferModeStreamedまたはStreamedResponseに設定します。また、Webサーバーで圧縮を有効にして、ダウンロードサイズをサイズの約10%に減らします。

+0

Webサービスに問題はありません。問題はXMLinをXElementを文字列変数にすることです。 –

+0

@Robin Day:さらに調査すると、Webサーバーで使用可能なメモリがなくなってしまいます。私の回答が約120MBに達したときに、同じ問題が発生し始めました。私の誕生日は4GBでしたが、メモリを増やしても助けになるとは思いません。 – leppie

関連する問題