我4年前做SP的时候,那时候需要过滤一些手机号码的黑名单,黑名单包括手机号码段,手机号码,黑名单大慨有300多万,过滤500多万的号码,包括了从文件载入和过滤后写入文件,只用了近10秒的时间,减去载入和写入IO的时间,过滤只需不到1秒的时候,过滤手机号码是当手机号码在黑名单中过滤掉,如果号码在黑名单的号码段中也被过滤掉,那时其他的同行是用数据库去过滤的,过滤这种数量的黑名单都要几个小时的时间
例如黑名单中包括
13560374
135603111
13570966914
13570961914
13570962914
待过滤的号码有
13560374123
13560374124
13560374125
13560311111
13560311112
13570966914
13570961914
13570962914
13570962915
13570962916
被过滤后的号码
13570962915
13570962916大家发表一下算法

解决方案 »

  1.   

    不会,想知道你咋过滤的,Mark
      

  2.   

    数据库为什么会慢,是因为有号码段,如果所有的黑名单都是手机号码数据库当然不会这么慢,如果有号码段,那你SQL语句要怎么写必须要用到like,并且数据的操作包括,先把要过滤的号码导入到数据库,过滤后再导出来,具体我不知道他们是怎么搞的,反正他们跟我说是要这些时间的,反正我不会数据库做这些事
      

  3.   

    其实没必要讨论什么1秒10秒还有数据过滤的什么(这个是因为我用的是服务器,至强双核CPU,磁盘阵列等有很多的加设备,当时一般的计算机过滤大慨需要10多秒的时间,比服务器的慢好几秒),我出这个也是因为之前有看到有讨论什么算法,我也突然想起来以前也有一个,最主要的还是算法,希望大家讨论,
      

  4.   

    不好意思,一时看错,但1w*300=300w,我的是300W*500w=150000w啊,那跟你的也是500倍啊,1分钟的500倍也是500分,也8个多小时了啊
      

  5.   


    int形储存不了11位长的数字,你用的ht5应该是指待过滤的表吧,因为待过滤的号码都是11位的,因为是手机号码,所以"遍历ht5将ht1包含号码段的移除",这就是多余的了,因为ht1里的是8位的,ht5都是11位,这里不可能有任何一个是相同的,
    "然后ht2、ht3(用比较大小的方法:比如8位就*1000补足11位和ht5比较)",这里不能够用单单大小比较的方法,例如号码
    13560471
    补充11位为135604710000
    跟135604710001比较是对的但135604720000用你的方法比较就会得到错的还有一点,需说黑名单中有号码段,但大部分黑名单肯定是号码,即11位,8到10位的只是少数,可能有几个位左右吧