Serialization 数据集序列化和OutOfMemoryException

Serialization 数据集序列化和OutOfMemoryException,serialization,dataset,asp.net-3.5,Serialization,Dataset,Asp.net 3.5,我有一个数据集,大约有25万行和80列,这导致StringBuilder在对我的数据集调用.GetXml()时抛出OutOfMemoryException(@System.String.GetStringForStringBuilder(String值,Int32 startIndex,Int32长度,Int32容量)) 正如我所读到的,这可以通过使用二进制表示而不是xml来克服,xml听起来很合乎逻辑。 因此,我将数据集上的RemotingFormat属性设置为binary,但问题仍然存在 我

我有一个
数据集
,大约有25万行和80列,这导致
StringBuilder
在对我的数据集调用.GetXml()时抛出OutOfMemoryException(@System.String.GetStringForStringBuilder(String值,Int32 startIndex,Int32长度,Int32容量))

正如我所读到的,这可以通过使用二进制表示而不是xml来克服,xml听起来很合乎逻辑。 因此,我将数据集上的RemotingFormat属性设置为binary,但问题仍然存在

我仔细研究了GetXml实现,似乎没有基于RemotingFormat的区别。相反,我发现GetXmlSchemaForemoting考虑RemotingFormat,但是这个方法是内部的,所以我不能从外部调用它。它由私有SerializeDataSet调用,后者由公共GetObjectData调用。 GetObjectData本身似乎是用于自定义序列化的


如何对数据集进行二进制(反)序列化?或者至少调用GetXml而不引发异常?我是否忽略了任何数据集属性?

您在问题中提供的链接来自2008年

还有一些新的讨论:

而且也来自

最后一个问题是关于读取150K记录时数据适配器的问题,但答案也可能对您感兴趣:

我要检查的第一件事是返回多少列, 以及它们的数据类型是什么

…您返回的字段比您需要的多,或者 有些字段是非常大的字符串或二进制数据。尝试 减少select语句以仅返回 绝对需要的显示器

如果这不起作用,您可能需要从数据表移动到列表 自定义数据类型(具有适当字段的类)


中,您在问题中提供的链接来自2008年

还有一些新的讨论:

而且也来自

最后一个问题是关于读取150K记录时数据适配器的问题,但答案也可能对您感兴趣:

我要检查的第一件事是返回多少列, 以及它们的数据类型是什么

…您返回的字段比您需要的多,或者 有些字段是非常大的字符串或二进制数据。尝试 减少select语句以仅返回 绝对需要的显示器

如果这不起作用,您可能需要从数据表移动到列表 自定义数据类型(具有适当字段的类)


中,您发现没有内置的方法将数据集序列化为二进制

将数据集序列化为二进制数据的唯一方法是实现自己的格式化程序

从这里开始

因为您发现没有内置的方法将数据集序列化为二进制

将数据集序列化为二进制数据的唯一方法是实现自己的格式化程序


从这里开始

我认为.NET应该能够以二进制格式处理这些数据,而开销要小得多,这就是为什么我对一个不需要在前端处理数据的解决方案感兴趣的原因。类似这样:但在我写这篇文章时,它似乎不起作用。我认为.NET应该能够以二进制格式处理这些数据,而开销要小得多。这就是为什么我对一个不需要在前端处理数据的解决方案感兴趣的原因。类似这样的东西:但在我写这篇文章时,它似乎不起作用。这对我来说不是新的链接。如果你查看我在米克罗德尔答案评论中的链接,你也会在那里找到它。有人建议将序列化更改为二进制,这又引出了我的问题……第一条评论中的链接讨论了同一个问题,但Dino的文章讨论了为什么不只是如何,在任何情况下都不会更改答案XML序列化无法扩展,您唯一的解决方案是创建二进制格式化程序。但这应该是正确的已根据以下内容内置:ds.RemotingFormat=SerializationFormat.Binary;我相信这从来没有实现过,所以即使你将格式设置为二进制,你仍然可以得到XMLIt。这是一位微软官员推荐的(blogs.msdn.com/b/tess/archive/2008/09/02/outofmemoryexceptions,remoting very large dataset.aspx),所以它应该可以以某种方式工作。这不是我的新链接。如果你查看我在米克罗德尔答案评论中的链接,你也会在那里找到它。有人建议将序列化更改为二进制,这又引出了我的问题……第一条评论中的链接讨论了同一个问题,但Dino的文章讨论了为什么不只是如何,在任何情况下都不会更改答案XML序列化无法扩展,您唯一的解决方案是创建二进制格式化程序。但这应该是正确的已根据以下内容内置:ds.RemotingFormat=SerializationFormat.Binary;我相信这从未实现过,所以即使你将格式设置为二进制,你仍然可以得到XMLIt。这是一位微软官员推荐的(blogs.msdn.com/b/tess/archive/2008/09/02/outofmemoryexceptions,同时远程处理非常大的数据集。aspx),所以它应该可以以某种方式工作。当然,也有例外,但我认为一般来说,如果您有25万行,并且看到OutOfMemoryException,您应该重新考虑您的方法。在内存中返回并保留25万行是一个相当糟糕的设计。听起来你真正的问题是如何将这些行导出到某个文件中?还是把它寄给别人?你到底想做什么?你不能一次看到所有的记录,对吗?所以,试着用寻呼的方式来获取记录,而不是一次获取所有记录。我不确定,但您也可以尝试为大数据获取数据块。@Panagiotis Kanavos:作业正在请求数据对其进行处理。正如我所写的,从数据库中获取数据块是没有问题的,但我对另一个解决方案感兴趣(我想知道为什么会有这样的内置解决方案)