Memory 最小化ADO.NET数据集的内存占用?
考虑到大量使用数据集的遗留系统,很少或根本不可能用业务对象或其他更高效的数据结构替换这些数据集: 有没有减少数据集内存占用的技术 我正在考虑设置初始容量(已知时)、取消限制等问题,但我对数据集几乎没有经验,也不知道哪些具体选项对我有用,或者它们中的任何一个是否重要 更新: 我知道长期重构的可能性,但我正在寻找快速修复方法,给定数据集中存储的一组DataTable对象,即已知哪些属性会影响内存开销 由于数据在内部存储的方式,设置初始容量可能是一种方法,因为这将防止对象在仅添加一行时分配任意大的内存量Memory 最小化ADO.NET数据集的内存占用?,memory,ado.net,dataset,Memory,Ado.net,Dataset,考虑到大量使用数据集的遗留系统,很少或根本不可能用业务对象或其他更高效的数据结构替换这些数据集: 有没有减少数据集内存占用的技术 我正在考虑设置初始容量(已知时)、取消限制等问题,但我对数据集几乎没有经验,也不知道哪些具体选项对我有用,或者它们中的任何一个是否重要 更新: 我知道长期重构的可能性,但我正在寻找快速修复方法,给定数据集中存储的一组DataTable对象,即已知哪些属性会影响内存开销 由于数据在内部存储的方式,设置初始容量可能是一种方法,因为这将防止对象在仅添加一行时分配任意大的内存
- 使用类型化数据集。它们将为您节省大量的编码,并且它们是键入的,这有助于进行简单的验证
- 如果您使用的是类型化DSs,请确保不修改生成的代码文件。如果您使用的是VS2005+,则可以将任何自定义业务对象行为放入DS的分部类中(而不是.designer代码文件)
- 使用DataView和。选择在DataRow对象中循环的位置
- 寻找一个好的代码生成工具,并构建一个rational数据访问框架,用于填充和更新DSs。其中一个问题是,有时,设计人员会将DS的设计直接绑定到db中的表,从而使设计容易受到数据结构更改的影响。如果您必须这样做,请构建或使用代码生成器从数据库构建数据访问层,如CodeSmith。首先,请看一些用于生成存储过程和数据访问类的CodeSmith模板
- 请记住,当与某人谈论“对象”与“数据集”时,本例中的对象是数据行,而不是数据集。由于部分类,您可以将行为放在“对象”上,为那些喜欢编写代码的人带来“对象”95%的好处
Directory-towns=new-Directory();
foreach(数据表中的var行)
{
if(城镇包含(第行城镇))
{
row.town=城镇[row.town]
}
其他的
{
城镇[排城镇]=排城镇;
}
}
然后GC可以回收大部分重复的字符串,但是这仅在数据集存在很长时间的情况下才有效
您可能希望在rowCreated事件中执行此操作,以便不首先创建所有重复的字符串对象。您可以尝试使表和行在代码隐藏文件中实现接口。然后随着时间的推移,更改代码以使用这些接口,而不是直接使用表/行 一旦大部分代码只使用了接口,就可以使用代码生成器创建实现这些接口的C#类,而无需增加行/表的开销
然而,仅仅迁移到64位并购买更多ram可能会更便宜…可能是个好主意。我们必须在一些真实数据上测试这一点,以测量内存的减少和对cpu周期的影响。
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;
}
}