Memory 最小化ADO.NET数据集的内存占用?

Memory 最小化ADO.NET数据集的内存占用?,memory,ado.net,dataset,Memory,Ado.net,Dataset,考虑到大量使用数据集的遗留系统,很少或根本不可能用业务对象或其他更高效的数据结构替换这些数据集: 有没有减少数据集内存占用的技术 我正在考虑设置初始容量(已知时)、取消限制等问题,但我对数据集几乎没有经验,也不知道哪些具体选项对我有用,或者它们中的任何一个是否重要 更新: 我知道长期重构的可能性,但我正在寻找快速修复方法,给定数据集中存储的一组DataTable对象,即已知哪些属性会影响内存开销 由于数据在内部存储的方式,设置初始容量可能是一种方法,因为这将防止对象在仅添加一行时分配任意大的内存

考虑到大量使用数据集的遗留系统,很少或根本不可能用业务对象或其他更高效的数据结构替换这些数据集:

有没有减少数据集内存占用的技术

我正在考虑设置初始容量(已知时)、取消限制等问题,但我对数据集几乎没有经验,也不知道哪些具体选项对我有用,或者它们中的任何一个是否重要

更新:

我知道长期重构的可能性,但我正在寻找快速修复方法,给定数据集中存储的一组DataTable对象,即已知哪些属性会影响内存开销

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

  • 如果您使用的是VS2005+,则可以实例化DataTable对象,而不是整个数据集。在2003年,如果DataTable是实例化的,那么默认情况下它附带DataSet。2005年及以后,您只会得到DataTable

  • 查看数据访问层以填充数据集或数据表。这是最常见的情况,有太多的数据通过。使您的查询更加具体

  • 确保您使用的代码不会做一些愚蠢的事情,比如在传递数据集时复制数据集。确保正在使用。选择语句或数据视图进行筛选和排序,而不是复制

  • 对于数据集,没有太多快速的“优化”。如果你的记忆有问题,请使用第2项和第3项。无论使用哪种类型的数据传输对象,都会出现这种情况

    并且擅长数据集。如果你不熟悉他们,你可以做傻事,比如做任何事。然后你会写一些关于它们如何糟糕的文章,这些文章实际上是关于你对它们知之甚少的文章。它们真的很有用,维护起来也很简单。以下几点提示:

    • 使用类型化数据集。它们将为您节省大量的编码,并且它们是键入的,这有助于进行简单的验证
    • 如果您使用的是类型化DSs,请确保不修改生成的代码文件。如果您使用的是VS2005+,则可以将任何自定义业务对象行为放入DS的分部类中(而不是.designer代码文件)
    • 使用DataView和。选择在DataRow对象中循环的位置
    • 寻找一个好的代码生成工具,并构建一个rational数据访问框架,用于填充和更新DSs。其中一个问题是,有时,设计人员会将DS的设计直接绑定到db中的表,从而使设计容易受到数据结构更改的影响。如果您必须这样做,请构建或使用代码生成器从数据库构建数据访问层,如CodeSmith。首先,请看一些用于生成存储过程和数据访问类的CodeSmith模板
    • 请记住,当与某人谈论“对象”与“数据集”时,本例中的对象是数据行,而不是数据集。由于部分类,您可以将行为放在“对象”上,为那些喜欢编写代码的人带来“对象”95%的好处

    这对你来说很不幸,但在同样的情况下,它会有很大的帮助

    如果要在数据集中存储大量相同的字符串,例如城镇名称,请查看仅对每个不同字符串使用单个字符串对象

    e、 g

    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;
        }
    }