鉴于遗留系统正在大量使用DataSet,很少或根本没有可能用业务对象或其他更有效的数据结构替换它们:
是否有任何减少DataSet内存占用的技术?
我在考虑设置初始容量(已知),删除限制等等,但我对DataSet几乎没有经验,也不知道哪些特定选项可供我使用,或者是否有任何特定选项对我来说很重要所有
更新
我知道长期重构的可能性,但我正在寻找快速解决方案,给出一组存储在DataSet中的DataTable对象,即已知哪些属性会影响内存开销。
由于数据存储在内部的方式,设置初始容量可能是一种方法,因为这会阻止对象在添加一行时分配任意大量的内存。
答案 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)
如果您使用的是VS2005 +,则可以实例化DataTable对象,而不是整个DataSet。在2003年,如果DataTable被实例化,默认情况下它会带有DataSet。 2005年之后,你只得到了DataTable。
查看数据访问层以填充DataSet或DataTables。最常见的情况是数据过多。使您的查询更具体。
确保您使用的代码不会像传递数据集时那样复制数据集。确保您使用.Select语句或DataViews进行过滤和排序,而不是复制。
DataSet没有很多快速的“优化”。如果您遇到内存问题,请使用第2项和第3项。无论您使用何种类型的数据传输对象,都会出现这种情况。
熟悉DataSet。如果你不熟悉它们,你可以做任何蠢事。然后你会写一些关于他们如何吮吸的文章,这些文章是关于你对它们知之甚少的文章。它们非常有用且易于维护。一对小贴士:
答案 2 :(得分:0)
您可以尝试使表和行在代码隐藏文件中实现接口。然后随着时间的推移更改代码以使用这些接口,而不是直接使用表/行。
一旦大多数代码只使用接口,您就可以使用代码生成来创建实现这些接口的C#类,而不会产生行/表的开销。
然而,移动到64位并购买更多内存可能更便宜......