一孑 posted on 四月 28, 2009 04:09

前面谈到了,做一个爬虫程序并不复杂,如果是做一个单线程的爬虫程序,可能一天就可以完成。但性能极低。所以,需要考虑多线程的问题。一旦引入多线程,很多问题都需要重新设计,最近一直在做soukey爬虫,反复测试一些内容,颇有些感触,在此做个记录。

多线程算法:上一篇文章谈到了,我们采用广度优先的算法。这个时候就需要考虑线程的分配算法了:我测试了两种:

1、如果设定30个线程,则任务启动就开30个线程去执行任务,任务信息通过一个队列来完成,所以30个线程就是不断的去读取一个队列,执行任务;这是第一种算法,看到网上的一些列子也都是采用此算法,同时codeproject上提供了一个开源的爬虫程序,也是此算法,http://www.codeproject.com/KB/IP/Crawler.aspx  。此算法需要考虑的就是冲突的问题,因为有可能会取出重复的网址。

2、先进行资源分配,再进行线程启动。类似下载程序的算法。当确定采集内容后,按照当前最大线程的数量进行资源分配,然后启动线程,让线程去执行。当一个线程执行完毕后,再进行重新分配。此种算法不会出现数据冲突,因为数据是在线程启动前就已经分配好的,然后线程执行都是在访问属于自己的资源数据,所以不会造成冲突,但问题是,每个线程执行完毕都会进行资源重新分配,这个过程会影响性能。但此问题当前不是很明显。

去重算法 :

1、可以采用哈希表,将Url存放到哈希表中,然后交给系统考虑去重的问题。应该说哈希表性能是最快的了,比其他性能要高。但数据量一旦很大的时候就会出问题。

2、B-Tree,建立一个b-tree,然后去重。

与UI线程的通讯:

1、invokeMethod ,如果频繁的刷新界面,此方法也会导致UI的反应迟钝,譬如想xenu那样的刷新,会出问题;

2、同步上下文,可以实现与UI的通讯,但在爬虫程序中不太适合使用,至于为什么,忘了,呵呵,我是放弃此种方法了;

3、线程委托,我现在是使用此种方法;

4、异步委托

数据输出的问题:

当前我是准备输出到界面,并且需要支持10万记录的显示,如果再多,则放在后台文件中,所以针对显示就需要考虑性能的问题了

1、 listview在显示方面性能比datagridview要好,但如果显示海量数据,也会有问题;

2、 如果一次性加载海量数据,可以采用虚拟模式;但如果频繁的加载,不建议采用此种方式;

3、消除listview的闪动可以采用双缓存的方式;

4、listview的更新的性能是很慢的,当前还未找到较好的方式;


Posted in:   Tags: ,
不允许评论

Blog Roll

    最新评论

    一孑工作室声明
    本站文章均为原创,如果转载请注明出处。

    © Copyright 2012『一孑工作室』
    管理我的网站
    京ICP备10018014号