事情是这样的,我现在用curl搞采集,每次采集一个新网址都会和已经采集的网址进行比较,如果已经存在则进行跳过,但现在已经存在的网址有3万条了,每次采集一条新网址则将会在数据库当中进行3万次比较,我现在用的是数据库当中的比较方法例如
select * from 数据库 where url=新url如果查询到则跳过,但现在的速度非常慢,不知道如何解决这一问题。

解决方案 »

  1.   

    建议不要通过数据库,每次数据库操作需要的system call数量都是惊人的,从内核到用户态之间切换很多次。30k的记录,平均100bytes算,也就3M,不算很大。放入到关联数组中即可。$web_urls[$url] = 1;if isset($web_urls[$url]) {
        //已经存在
    } else {
        //不存在
        $web_urls[$url]=1;
    }如果数据量很大,可以用trie树节省存储空间。
      

  2.   

    大体看明白了。但不知道用php如实实现,还需要把2万个网址放入内存然后用字典树?还是直接在数据库当中用字典数呢?
      

  3.   


    字典树就是存储和检索网址的数据结构,2万个网址放入字典树中
    数据库中无法使用字典树,数据库一般内置hash和B树,你可以用hash或者B树建索引
    不过你的程序,如果要连数据库才能判断,还不如用memcached,比数据库更高效直接用关联数组是最方便的,性能也应该差不到哪里去
    关联数组内部实现,性能再低也要是个红黑树或者B树,平均15次检索可以在3万多条数据中检索了
    这个判定所消耗的时间,跟从网络中抓页面比,基本是忽略不计的,对这个做优化没有多少意义