需求: 挑出大量数据中的重复数据
.NET 做数据处理,现在是 把数据一条条addrow 到datatable里,在初始化datatable时设置其 primarykey 字段,如果是重复的数据 会引发ConstraintException,这样就能抓到重复的记录。
如何实现 对大数据量 数据 重复记录 筛选出来,有时数据量会上1000W,如果不借助datatable,自己实现,用什么样的数据结构和算法,能保证效率?如果数据量大到内存无法全部加载呢?
欢迎大家一起讨论!
用 MD5 计算信息指纹,然后用哈希表来消重。这是典型的消重做法,1000w 数据根本算不上海量,一台普通PC机就可以处理。
补充
MD5 计算1百万行大概是 55 秒,这是Java 的数据,.net 下你可以自己测试一下。
http://www.coderanch.com/t/203090/Performance/java/Fastest-way-calculating-MD
.net 的 Dictionary 处理 1 千万行应该还是没有问题的,我测试过。但如果再大,比如说1亿行,会有一些问题。
1、算哈希,假设数据变成128位的哈希码
2、根据128位的前16位分文件存储
3、每个文件里再找重复
这是分治的思路,至于具体根据几位分文件,是不是要二级细分都可以修改
顶楼上两位。
我觉得用位图算法更简单
1、建立bitarray[num]数组,全部初始化为false
2、扫描数字,如果存在数i,就将bitarray[i]置为true
3、这样只需要扫描两次(也可以扫描一次),就可以得到其中的重复数