【问题标题】:DataSet serialization and OutOfMemoryExceptionDataSet 序列化和 OutOfMemoryException
【发布时间】:2013-11-26 05:04:23
【问题描述】:

在调用 . GetXml() 在我的数据集上。

当我阅读here (last paragraph) 时,这可以通过使用二进制表示而不是 xml 来克服,这听起来很合乎逻辑。 因此,我将数据集上的 RemotingFormat 属性设置为二进制,但问题仍然存在。

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

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

【问题讨论】:

  • 当然有例外,但我认为一般来说,如果你有 250k 的任何东西并且你看到 OutOfMemoryExceptions,你应该重新考虑你的方法。
  • 在内存中返回并保留 250K 行是一个相当糟糕的设计。听起来您的 real 问题是如何将这些行导出到某个文件?还是发给别人?你真正想做什么?
  • 看到你不能一次看到所有的记录,对吧?因此,请尝试采用分页方法,而不是一次获取所有记录。不确定,但您也可以尝试以大数据块的形式获取数据。
  • @Panagiotis Kanavos:一项工作正在请求数据以对其进行处理。正如我所写的,从数据库中获取块是没有问题的,但我对另一种解决方案感兴趣(并且想知道为什么二进制序列化的构建不起作用)。我同意这是很多数据,可能是 600mb,但这仍然应该是可序列化的。
  • 正如所有其他人所说,您的做法是错误的。在内存中加载 600MB 并尝试立即编写它可能需要很少的代码,但无法扩展。如果您没有绑定到数据集架构(无论如何都不是非常可互操作),您应该使用 DataReader 读取行并使用 XmlWriter 写入它们。或者使用 SSIS 自动化整个过程。这适用于任何数据库,任何语言。如果您使用 IBM DB2 和 C++ 或 Java,您的运气不会更好

标签: serialization dataset asp.net-3.5


【解决方案1】:

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

还有一些新的讨论:

dotnespider 2009

也来自SO 2011

最后一个是关于DataAdapter在读取150K记录时出现的问题,但答案也可以让你感兴趣:

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

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

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

来自accepted answer

【讨论】:

  • 我认为 .NET 应该能够以二进制格式处理这些数据,而且开销要少得多,这就是我对不需要在前端处理数据的解决方案感兴趣的原因。像这样的东西:blogs.msdn.com/b/tess/archive/2008/09/02/… 但正如我所写的,这似乎不起作用。
【解决方案2】:

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

将数据集序列化为二进制数据的唯一方法是实现自己的格式化程序。
从这里开始http://msdn.microsoft.com/en-us/magazine/cc163911.aspx

【讨论】:

  • 这不是我的新链接。如果您查看我在 MikroDel 答案的评论中的链接,您也会在那里找到它。有一个建议将序列化更改为二进制,这又回到了我的问题......
  • 第一条评论中的链接讨论了相同的问题,但 Dino 的文章涵盖了为什么不只是如何并且在任何情况下都不会改变答案 XML 序列化无法扩展,您唯一的解决方案是创建一个二进制格式化程序。
  • 但是根据blogs.msdn.com/b/tess/archive/2008/09/02/…,这应该是内置的:ds.RemotingFormat = SerializationFormat.Binary;
  • 我相信这从未实现,所以即使您将格式设置为二进制,您仍然可以获得 XML
  • 微软官方推荐[这里](blogs.msdn.com/b/tess/archive/2008/09/02/outofmemoryexceptions-while-remoting-very-large-datasets.aspx ) 所以它应该以某种方式工作。
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2016-07-17
  • 1970-01-01
  • 2013-06-25
  • 2015-01-31
相关资源
最近更新 更多