最小化ADO.NET DataSet的内存占用量?

时间:2009-03-26 12:22:20

标签: memory ado.net dataset

鉴于遗留系统正在大量使用DataSet,很少或根本没有可能用业务对象或其他更有效的数据结构替换它们:

是否有任何减少DataSet内存占用的技术?

我在考虑设置初始容量(已知),删除限制等等,但我对DataSet几乎没有经验,也不知道哪些特定选项可供我使用,或者是否有任何特定选项对我来说很重要所有

更新

我知道长期重构的可能性,但我正在寻找快速解决方案,给出一组存储在DataSet中的DataTable对象,即已知哪些属性会影响内存开销。

由于数据存储在内部的方式,设置初始容量可能是一种方法,因为这会阻止对象在添加一行时分配任意大量的内存。

3 个答案:

答案 0 :(得分:1)

这对你很有帮助,但在同样的情况下它会有很大的帮助。

如果要在数据集中存储大量相同的字符串,例如Towns的名称,只使用带有每个不同字符串的单个字符串对象。

e.g。

Directory <string, string> towns = new Directory <string, string>();
foreach(var row in datatable)
{
    if (towns.contains(row.town))
    {
       row.town = towns[row.town]
    }
    else
    {
       towns[row.town] = row.town;
    }
}

然后GC可以回收大多数重复的字符串,但这只适用于数据集一直存在的情况。

您可能希望在rowCreated事件中执行此操作,以便不会首先创建所有重复的字符串对象。

答案 1 :(得分:0)

  1. 如果您使用的是VS2005 +,则可以实例化DataTable对象,而不是整个DataSet。在2003年,如果DataTable被实例化,默认情况下它会带有DataSet。 2005年之后,你只得到了DataTable。

  2. 查看数据访问层以填充DataSet或DataTables。最常见的情况是数据过多。使您的查询更具体。

  3. 确保您使用的代码不会像传递数据集时那样复制数据集。确保您使用.Select语句或DataViews进行过滤和排序,而不是复制。

  4. DataSet没有很多快速的“优化”。如果您遇到内存问题,请使用第2项和第3项。无论您使用何种类型的数据传输对象,都会出现这种情况。

    熟悉DataSet。如果你不熟悉它们,你可以做任何蠢事。然后你会写一些关于他们如何吮吸的文章,这些文章是关于你对它们知之甚少的文章。它们非常有用且易于维护。一对小贴士:

    • 使用键入的DataSet。它们可以为您节省大量编码并对其进行打字,这有助于简单验证。
    • 如果您使用的是类型化的DS,请确保不要修改生成的代码文件。如果您使用的是VS2005 +,则可以将任何自定义业务对象行为放在DS的部分类中(而不是.designer代码文件)。
    • 使用DataView和.Select,无论您发现自己在DataRow对象中循环。
    • 寻找一个好的代码生成工具,并构建一个合理的数据访问框架,以便从DS中填充和更新。其中一个问题是,设计人员有时会将DS的设计直接与数据库中的表联系起来,从而使设计对数据结构的变化变得脆弱。如果您 - 必须这样做,构建或使用代码生成器来从db构建数据访问层,如CodeSmith。首先查看一些CodeSmith模板,以生成存储过程和数据访问类。
    • 请记住,当与某人谈论“对象”与“数据集”时,此情况下的对象是DataRow,而不是DataSet。而且由于部分类可以将行为放在“对象”上,为喜欢编写代码的人带来95%的“对象”好处。

答案 2 :(得分:0)

您可以尝试使表和行在代码隐藏文件中实现接口。然后随着时间的推移更改代码以使用这些接口,而不是直接使用表/行。

一旦大多数代码只使用接口,您就可以使用代码生成来创建实现这些接口的C#类,而不会产生行/表的开销。

然而,移动到64位并购买更多内存可能更便宜......