我正在编写一个程序,用于将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
感谢所有回复的人......
答案 0 :(得分:5)
使用XmlTextWriter
缠绕Reponse.OutputStream
将XML发送到客户端并定期刷新响应。这样,您在任何时候都不必拥有超过几mb的内存(至少是发送给客户端)。
答案 1 :(得分:4)
你不能只是将响应流式传输到客户端吗? XmlWriter不要求将其基础流缓冲在内存中。如果它是ASP.NET,您可以使用Response.OutputStream,或者如果它是WCF,您可以使用response streaming。
答案 2 :(得分:1)
HTTP获得1演出?好多啊!也许你应该重新考虑。 至少gziping输出可能会有所帮助。
答案 3 :(得分:1)
您不应该使用字符串操作来创建XML。
相反,您应该使用XmlTextWriter
,XmlDocument
或(在.Net 3.5)XElement
类在内存中构建XML树,然后将其直接写入{{1使用Response.OutputStream
。
直接写入包裹XmlTextWriter
的{{1}}最有效(你一次不会在内存中有一个完整的元素树),但会更复杂一点。
通过这种方式,您将永远不会有包含整个对象的单个字符串(或数组),因此应避免使用OutOfMemoryExceptions。
答案 4 :(得分:1)
有类似的问题,希望这会对某人有所帮助。我的初始代码是:
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());
}
答案 5 :(得分:0)
你必须在他们自己的个人GET上返回每条记录(或一小组记录)。