OutOfMemoryException - 数据集< - > XML< - >数据集

时间:2010-04-19 16:42:13

标签: c# sql-server-2005 memory dataset out-of-memory

我遇到了一个需要处理大量数据的巨大问题。

我得到一个有5个数据表的数据集。其中一个表有大约3000列和50,000条记录。

我需要将此数据集完全保存在SQL数据库中作为XML,我需要稍后检索它。

我无法进行任何设计更改以跳过它。当我做dataset.GetXml()时,它返回一个巨大的字符串,抛出OutOfMemoryException。我知道字符串数据类型有一定的限制来携带数据。

但是在sql表中,xml列最多可以保存2 Gb。那么如何在数据库和我的应用程序之间来回移动这个数据集呢?

谢谢

NLV

3 个答案:

答案 0 :(得分:4)

您的设计听起来有缺陷。为什么需要将整个表检索到内存中?改为通过它进行翻页 - 以较小批量操作桌面 - 例如,一次1000条记录。

你可能甚至不需要这样做。通常,数据库应用程序仅对正在变化的数据进行操作。如果您的应用需要修改10行,则只检索那10行。您不仅可以保存内存,还可以保存检索和发布数据所需的所有时间。

表中有3000列?那也闻起来(真的)不好。查看normalizing您的数据库。

我知道解决眼前的问题并继续前进会更容易。但是,如果你事先解决(坦率地说非常严重的)设计问题,那么从长远来看,你会遇到很多很少的问题。

答案 1 :(得分:1)

您需要切换到涉及流式传输的所有API,使用SqlDataReader(一次1行),而不是DataSet。此外,如果可能,将数据流式传输到文件系统上的临时文件,而不是将其保存在内存中。

如果1行太多而无法容纳,那么您可能需要使用流API与相关大列中的blob进行通信。

答案 2 :(得分:1)

在开始之前,

3k列x 50k行= 1.5亿个元素。每个元素有多少个字符?

我不得不问......你为什么要使用数据库来存储它?您也可以将其存储在文件服务器上。

50k行很小,但是3k列是极端的,并且它在XML中非常膨胀