当前位置:编程学习 > C#/ASP.NET >>

Remoting返回超大DataSet报Out of Memory问题,WCF的流传输可否解决?

我这里有一实现要由Client端通过Remoting  TCP CHANNEL 取大量的数量, 可能有几百MB, 现在是通过Remoting由数据库提取资料到DataSet后直接返回,但是由于服务端的内存是有限的, 且目前发现好像是BinaryFormat序列化的问题, 导致数据只要比较大, 就会报'System.OutOfMemoryException'的错误,DataSet的 RemotingFormat已是Binary的.
查过一些贴子,好像微软一直没有解决此问题, 如下所示

我的问题是我看在WCF中已有大数据量的Stream传输的功能, Remoting中有类似功能吗?
另外, 如果用WCF的Stream功能传输,我看Sample时由一个FileStream中返回, 如果我想直接由数据库中读数据按Stream返回该如何做?  我自己试了一下是用DataSet的WriteXml写到服务端硬盘, 再用FileStream读取返回给client,但这样好像数据还是一次先要取到DataSet里, 有没有可能由数据库一边取一边返回给Client ? 


 Server stack trace: at System.Runtime.Serialization.ObjectIDGenerator.Rehash() at System.Runtime.Serialization.ObjectIDGenerator.GetId(Object obj, Boolean& firstTime) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.InternalGetId(Object obj, Boolean assignUniqueIdToValueType, Type type, Boolean& isNew) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteString(NameInfo memberNameInfo, NameInfo typeNameInfo, Object stringObject) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteKnownValueClass(NameInfo memberNameInfo, NameInfo typeNameInfo, Object data) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArrayMember(WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, Object data) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.SerializeResponse(IServerResponseChannelSinkStack sinkStack, IMessage msg, ITransportHeaders& headers, Stream& stream) at System.Runtime.Remoting.Channels.BinaryServerFormatterSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, IMessage& responseMsg, ITransportHeaders& responseHeaders, Stream& responseStream) Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at  --------------------编程问答-------------------- XmlTextWriter writer = new XmlTextWriter(Response.OutputStream, Response.ContentEncoding);
writer.Formatting = Formatting.Indented;
writer.Indentation = 4;
writer.IndentChar = ' ';
writer.WriteStartDocument();
ds.WriteXml(writer);
writer.Flush();
Response.End();
writer.Close(); --------------------编程问答-------------------- 参考 --------------------编程问答-------------------- 如果 切割数据,分块传输,有REMOTING的范例代码吗?谢谢,现在不知道该如何实现 
--------------------编程问答-------------------- 利用WCF开发不同的服务,然后托管在不同的服务器上,
以支撑大量的访问负荷、大数据量处理、数据挖掘等,整个系统就可以有效地利用服务器资源,减轻系统负荷。 --------------------编程问答-------------------- 为什么要下载这么大的DataSet?

不如通过别的方法,导出Access或Excel给用户. --------------------编程问答-------------------- 用户有这个需求,可我总不能说由于技术问题,微软不给你取,哈哈!
看来只能通过SQL分页多次取了 --------------------编程问答-------------------- 几百MB的数据,序列化/反序列化的时候可能需要动用超过1G的内存,所以会OOM,只能想办法控制每次取数据的量 --------------------编程问答--------------------
引用 7 楼 shalen520 的回复:
几百MB的数据,序列化/反序列化的时候可能需要动用超过1G的内存,所以会OOM,只能想办法控制每次取数据的量


序列化/反序列化 会 用这么大的内存啊  学习了  --------------------编程问答-------------------- 切分对象成小一点吧,几百MB,过分了点吧,又不是测试服务器压力 --------------------编程问答-------------------- up --------------------编程问答-------------------- UP --------------------编程问答-------------------- 分批分时间点执行试试。 --------------------编程问答-------------------- 取出来放一List里面,然后一点点传送 --------------------编程问答-------------------- 实在不行的话, 你可以自己建个SOCKET连接, 自己控制所有的一切, 问题不就解决了吗? --------------------编程问答-------------------- ProtoBuf替代原始的序列化xml方式
参考FortuneBase
   www.cnblogs.com/mail-ricklee --------------------编程问答--------------------
补充:.NET技术 ,  Web Services
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,