求海量数据查找算法? 本帖最后由 kevin11681 于 2010-07-14 09:12:42 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 既然你是指对primarykey 字段做重复筛选。。那你完全不必把所有的字段都ADDROW。。你完全可以设计一个算法。。对你定义的那个主键来排除重复。。就可以用到算法了。。具体的我也用的少。。呵呵给你一思路。。思路万岁。。 lz问题的重点就是 数据量大无法全部加载处理,,如果抓取的数据字段中数据全部一致,那那么多重复数据,在输入的时候 何不过滤掉如果抓取的数据字段中数据部分一致,不知lz把该字段重复数据抓出来后 是集体做处理,还是以分页形式展示,集体处理,建议lz分批次处理,分页的话以页数为准 取部分数据把。。 补充: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,不知道这个值是如何确定的? 和机器的内存量是否有关) 所以想 自己实现一个数据结构和算法,起到过滤器的作用,且不受数据量大小的限制,通用的?谢谢关注!请大家根据场景讨论 既然是有primary key,为什么要使用 datatable呢?直接使用hash map,c#里对于dictionary,你的主键的大小不应该会太多,假设主键长32bytes,重复的数据是1000万,那么10000000*32=320M,你有2g内存,应该是绰绰有余了,如果你有上亿数据,内存装不下了,也不要紧,你可以使用berkeley db进行外部存储,bdb也支持hash算法,你可以内存里保存1000万,判断一条记录是否存在时,现在内存搜索,如果没有再去bdb搜索,如果发现不重复的数据首先要加入内存,如果内存中数据超过1000万,你可以把其中500万写入bdb,这样能保证很高的查询性能. 用List<int> 只存不重复的主键如果重复的加入一个DataTable这个DataTable达到一定数量,启动一个线程去写入错误数据文件 一定是其他地方出了问题. 即便是datatable也不可能装不下1000万数据.但是,同7楼.我也推荐使用hashtable因为效率考虑. http://wenku.baidu.com/view/52d7c3c75fbfc77da269b13c.html 为什么不在数据库里面处理了?页面只是展示功能,要是像你那样一行行add,出了条数受限制外还涉及性能问题。 http://topic.csdn.net/u/20091025/21/76bdeb3b-0825-47af-b5aa-08069e4a6354.html可以的话以后自己开发个数据库引擎 如果仅仅考虑查的效率,为何不用hashtable 于dictionary比如你从数据库中得到了一个结果集,再假如你把这个结果集定义为一个类 Data类,有ID Name Age Phone等字段那么你将之后查询时会用到的字段存放在HashTable Dictionary的键中,例如所有的字段你都要用到,那么你就存“001-lily-15-13866666666”,然后把这个对象放到值中,那么搜索的时候你也就需要拼一下键而已,HashTable与Dictionary的查询都是散列算法,极快 c# 单元测试小问题 Delphi代码转C#代码 何让Comobox读取文本文档里的数据 请教TextBox控件的问题 求指导SQL语句问题 WPF,如何做一个QQ、360那种安装包 流读写时的偏移量参数有什么用? 晕啊~~~为什么VS2003的MSDN是英文的??? 使用“new”关键字创建对象实例。。。请问这个该怎么改呢? 把控件A赋值给控件B 的问题,B为何未获得A的一些属性,事件? 一个小问题
集体处理,建议lz分批次处理,
分页的话以页数为准 取部分数据把。。
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,不知道这个值是如何确定的? 和机器的内存量是否有关)
所以想 自己实现一个数据结构和算法,起到过滤器的作用,且不受数据量大小的限制,通用的?谢谢关注!请大家根据场景讨论
如果重复的加入一个DataTable
这个DataTable达到一定数量,启动一个线程去写入错误数据文件
因为效率考虑.
可以的话以后自己开发个数据库引擎
“001-lily-15-13866666666”,然后把这个对象放到值中,那么搜索的时候你也就需要拼一下键而已,HashTable与Dictionary的查询都是散列算法,极快