本帖最后由 kevin11681 于 2010-07-14 09:12:42 编辑

解决方案 »

  1.   

    既然你是指对primarykey 字段做重复筛选。。那你完全不必把所有的字段都ADDROW。。你完全可以设计一个算法。。对你定义的那个主键来排除重复。。就可以用到算法了。。具体的我也用的少。。呵呵给你一思路。。思路万岁。。
      

  2.   

    lz问题的重点就是 数据量大无法全部加载处理,,如果抓取的数据字段中数据全部一致,那那么多重复数据,在输入的时候 何不过滤掉如果抓取的数据字段中数据部分一致,不知lz把该字段重复数据抓出来后 是集体做处理,还是以分页形式展示,
    集体处理,建议lz分批次处理,
    分页的话以页数为准 取部分数据把。。
      

  3.   

    补充:
    1,该功能用于ETL 工具,加载端,数据是从一个队列中取的,不是通过SQL 查询到的。队列中的数据 是另外一个处理线程,放进去的。所以无法使用SQL 语句消除重复行。2,ETL 加载端 要保证把队列中的数据加载到目标表,而如果目标表有主键,或唯一索引,使用Oracle 的 ODP.NET 提供的oraclebulkcopy方法,能够大大提高加载效率。但如果 在主键上 有重复记录 加载的话,oracleBulkcopy 方法就会报异常,并使加载目标表的索引处于不可用状态。因为处理后的数据有可能在主键字段上是重复的(脏数据) ,该问题的本质: 要把流向加载端的 重复数据 过滤出来,单独写成错误数据文件?3,现在的处理方法时,建一张datatable 只包含唯一索引字段,尝试着把过来的一行数据 唯一索引字段的值,datatable.rows.addrow(...),如果报ConstraintException异常,说明该行数据是脏数据,处理。问题是:如果数据量特别大时,会引发outMemoryExcepiton,内存溢出。我测试(2G内存) 超过300W条,从MSDN上查到DataTable 可存储的最大行数是 16,777,216,不知道这个值是如何确定的? 和机器的内存量是否有关) 
    所以想 自己实现一个数据结构和算法,起到过滤器的作用,且不受数据量大小的限制,通用的?谢谢关注!请大家根据场景讨论
      

  4.   

    既然是有primary key,为什么要使用 datatable呢?直接使用hash map,c#里对于dictionary,你的主键的大小不应该会太多,假设主键长32bytes,重复的数据是1000万,那么10000000*32=320M,你有2g内存,应该是绰绰有余了,如果你有上亿数据,内存装不下了,也不要紧,你可以使用berkeley db进行外部存储,bdb也支持hash算法,你可以内存里保存1000万,判断一条记录是否存在时,现在内存搜索,如果没有再去bdb搜索,如果发现不重复的数据首先要加入内存,如果内存中数据超过1000万,你可以把其中500万写入bdb,这样能保证很高的查询性能.
      

  5.   

    用List<int> 只存不重复的主键
    如果重复的加入一个DataTable
    这个DataTable达到一定数量,启动一个线程去写入错误数据文件
      

  6.   

    一定是其他地方出了问题. 即便是datatable也不可能装不下1000万数据.但是,同7楼.我也推荐使用hashtable
    因为效率考虑.
      

  7.   

    http://wenku.baidu.com/view/52d7c3c75fbfc77da269b13c.html
      

  8.   

    为什么不在数据库里面处理了?页面只是展示功能,要是像你那样一行行add,出了条数受限制外还涉及性能问题。
      

  9.   

    http://topic.csdn.net/u/20091025/21/76bdeb3b-0825-47af-b5aa-08069e4a6354.html
    可以的话以后自己开发个数据库引擎
      

  10.   

    如果仅仅考虑查的效率,为何不用hashtable 于dictionary比如你从数据库中得到了一个结果集,再假如你把这个结果集定义为一个类 Data类,有ID Name Age Phone等字段那么你将之后查询时会用到的字段存放在HashTable Dictionary的键中,例如所有的字段你都要用到,那么你就存
    “001-lily-15-13866666666”,然后把这个对象放到值中,那么搜索的时候你也就需要拼一下键而已,HashTable与Dictionary的查询都是散列算法,极快