请教个问题,我有一个系统,要实时监控一部分数据,某个端口实时接受数据,数据大约包括2000个对象,但是每个对象属性有大约二○个字段,除标识字段外都可能随机随着每次接受的数据更新,我现有方法是用DATATABLE存储在内存里,但是发觉会导致速度越来越慢,有什么办法能减少系统资源的消耗吗?

解决方案 »

  1.   

    楼主兄弟,我也遇到这个问题了,在内存中的dataTable里要存大量的数据,很担心内存消耗啊
      

  2.   

    刚才又看了一下,真看的我心惊胆占的,我的dataTable比楼主的要小,有接近20个字段,每增加一个datarow加入dataTable里(内存里的dataTable做数据源一直是占用的)就增加了0.004k左右的内存,我的程序在运行时就占用到了大概37M(我并没有使用内存压缩技术),如果datarow的增加时间间隔比较小,例如一秒增加一次,而且用户连续几天都在记录数据,后果我都不敢想了。能做的就是记录到一定时候,比如让用户自己去设置或到例如1000条数据,把dataTable里的前一千条数据删除掉。似乎也没有更好的办法了吧?
      

  3.   

    楼上地,可惜偶们没有钱买iRam啊,俺用vs.net2005才512M内存,我郁闷死了,555555突然又想到了一个办法,就是如果时间间隔不是很长的话,可以先把数据写到内存里,然后再一次写到xml里,更新时再加载一下。这样可以保证内存不再不断增加了,但实际情况还要自己去判断,行不行就看你程序的需要了
      

  4.   

    to zhongkeruanjian(编程亮子) :
    Arraylist占用内存会比dataTable小么?但理论上还是会不断增加啊?没做过试验会差多少,请指教一下
      

  5.   

    zhongkeruanjian(编程亮子) 
       Arraylist代替DataTable支持这个做法~~
      
     
      

  6.   

    ArrayList 都扛不住地时候,你就要考虑持久化了(不管是数据库还是XML ) ,并根据数据访问频繁度来缓存数据
      

  7.   

    哎,实践证明Arraylist也是以0.004k递进增加的,不知道windows系统设计是不是最小就是0.004k进行增加的。
      

  8.   

    一次少处理点数据;
    用DataAdapter,以连接换内存。
      

  9.   

    to:zoujiaming(笨笨的!) 0.004K 是多少,不就是4字节吗?在32位计算机中,4字节=32位,是数据的最小对齐大小(如果数据没有32位,会自动填充为32位,以利于cpu的处理)所以bool之类的东西,占用的内存和int32是一样的。都是32位。
    =============================
    还有,不管是往ArrayList 还是往其他数据结构里填充数据你只要填充一个,不管是不是空对象。必然增加32位。这32位,并不是对象本身的内存消耗,而是指向对象的指针。怎么都无法省去的。
      

  10.   

    to xzhunter(xz) :
    没错,非常同意你的看法。但不断增加始终不是办法,试试到一定量删除一些吧
      

  11.   

    其实,我也一直想怎么才能减少内存消耗。数据小的时候还好,数据一大,实在受不了。===================
    我觉得至少有两种方法。1,自己对齐数据,就是将多个不足32位的成员变量(字段)合成一个。当然处理起来就麻烦了,但是至少内存消耗少了。当然你也可以做一个中间转换的函数,自动把内存中的数据转换。2,识别那些东西是频繁重复的,对于频繁重复的,例如都是null,只有几个不是null,那么就不要都存储了,那样至少会浪费一个32位的指针空间,你只要存储不是null的,那么就可以节省很多内存
      

  12.   

    0.004k??1、你是怎么“观察”出来的,这么小的数值,怎么测得呢?2、0.004k = 4B 就是4个字节,也就是 32位。window就是32位的系统呀。你还能找到更小的了吗?刚刚看到 xzhunter(xz) 得回帖,比我的详细多了。
      

  13.   

    DataTable不是这么用地。你不可能把一百万条记录都放到内存里处理。如果你非要这么做的话,说明你的程序设计有问题,
      

  14.   

    xzhunter(xz) ( ) 信誉:100 说法赞同,并且赞同持久化。
    但是比较鄙视的是编程亮子的是用arraylist的做法(不要见怪)。因为你可以看看微软的官方资料,关于arraylist,他是默认为16个地址长的数组,如果数量不够,要动态增加,这种增加是以成倍的内存地址增加的,而且地址空间必须连续,也就是说要比链表的方式要垃圾很多!如果数组大了,搞不好每插入一次数据,就需要垃圾回收器把所有的操作系统线程挂起,执行回收堆区整合,压缩,再重新分配根地址。想想又多可怕