目前的做法:
在数据库中建一张简单的表,然后把要去重的信息,建为主键。
验证方法,往该表Insert,如果成功,则说明不重复。反之,重复。需求:
1)数据量很大(所以,这些东西不能放在内存中,需要外部介质持久)
2)只要对当天的数据去重(所以,该表每天晚上定时清空)现求更高效的去重方式。其性能希望和消息队列的收发速度对等。

解决方案 »

  1.   

    标准SQL有DISTINCT关键字,T-SQL有EXCEPT和INTERSECT子句...这些应该是SQL基础...
      

  2.   

    基于数据库的验证,不能足以快到和消息队列的收发速度对等。(而且这里还不能批量Insert)
      

  3.   

    "在数据库中建一张简单的表,然后把要去重的信息,建为主键。
    验证方法,往该表Insert,如果成功,则说明不重复。反之,重复。"目前采用的这种方法效率极其低下,利用SQL内部的主键冲突机制,等待SQL事务处理时抛错,每一条抛一次... ...既然要求要"其性能希望和消息队列的收发速度对等",那么你就不应该在插入数据的时候去重,应该把去重独立出来,用其他线程或者其他进程去批量去做去重.在高效的算法或者方式被调用成千上万次也会变得低效.
      

  4.   

    计算需要去重的信息生成一个hash值,还是需要一个集合存储已有的hash值或者直接用hashset存储去重信息
      

  5.   

    如果是100万的话完全可以在内存中处理
    只是去重的话复杂度是O(n),如果用B+或者其他排序的方式复杂度是O(nlogn),必须用Hash