簡體   English   中英

內存中非常大的字符串

[英]very large string in memory

我正在編寫一個程序,用於格式化100個MB字符串數據(接近一個演出)到xml ==我需要將它作為對HTTP(GET)請求的響應返回。

我正在使用StringWriter / XmlWriter在循環中構建記錄的XML並返回

using (StringWriter writer = new StringWriter())
using (writer = XmlWriter.Create(writer, settings)) //where settings are the xml props

writer.ToString() 

在測試期間,我看到了一些內存異常 - 並且對如何找到解決方案毫無頭緒? 你們對內存優化的響應傳遞有什么建議嗎?

有一種內存有效的數據編碼方式嗎? 或者可能分塊數據 - 我只是想不出如何在不將整個事物構建成一個巨大的字符串對象的情況下返回它

謝謝

- 一些澄清 - 這是一個通過千兆以太網鏈接的asp .net webservices應用程序,正如喬希指出的那樣。 我對它不太熟悉,所以仍然有點學習曲線。

我正在使用XMLWriter創建XML並使用String創建一個字符串

一些統計數據 - 響應xml大小=約385兆(我的數據大小會快速增長到超過這個數量)

由內存分析器計算的字符串對象大小=峰值為605MB

並感謝所有回復的人......

使用圍繞Reponse.OutputStream XmlTextWriter將XML發送到客戶端並定期刷新響應。 這樣,您在任何時候都不需要在內存中擁有超過幾mb(至少對於發送到客戶端而言)。

你不能只是將響應流式傳輸給客戶端嗎? XmlWriter不要求將其基礎流緩沖在內存中。 如果它是ASP.NET,您可以使用Response.OutputStream,或者如果它是WCF,您可以使用響應流

有一個類似的問題,希望這將有助於某人。 我的初始代碼是:

var serializer = new XmlSerializer(type);
string xmlString;

using (var writer = new StringWriter())
{
    serializer.Serialize(writer, objectData, sn); // OutOfMemoryException here
    xmlString = writer.ToString();
}

我最終用MemoryStream替換了StringWriter,這解決了我的問題

using (var mem = new MemoryStream())
{
    serializer.Serialize(mem, objectData, sn);
    xmlString = Encoding.UTF8.GetString(mem.ToArray());
}

HTTP獲得1演出? 好多啊! 也許你應該重新考慮。 至少gziping輸出可能會有所幫助。

您不應該使用字符串操作創建XML。

相反,您應該使用XmlTextWriterXmlDocument或(在.Net 3.5中) XElement類在內存中構建XML樹,然后使用XmlTextWriter將其直接寫入Response.OutputStream

直接寫入包裝Response.OutputStreamXmlTextWriter將是最有效的(你永遠不會在內存中同時擁有整個元素樹),但會更復雜一些。

通過這種方式,您將永遠不會有包含整個對象的單個字符串(或數組),因此應避免使用OutOfMemoryExceptions。

您必須在他們自己的個人GET上返回每條記錄(或一小組記錄)。

暫無
暫無

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

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