请问如何优化我的爬虫程序

paul_11 2008-04-30 12:32:10
我这个程序是c#写的,先抓去某网站全部的Url,之后处理所有下载到数据库中的html,从中分析有用的信息。
现在我爬一个网站要七八个小时!发现是因为网页的下载速度比较慢(因为是普通家庭用1Mb的带宽,实际也就80K),可是80k算下来12个小时也是大概能下5G以上的数据,可我下载的页面总共大小才600Mb。也就是说浪费了很多带宽。
现在我正考虑用多线程优化程序,在处理Url的同时下载下一个页面。我的本本是“裤内双核”处理器。不知道我做多线程时是否需要考虑到“双核”这个概念。
...全文
125 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
paul_11 2008-04-30
  • 打赏
  • 举报
回复
多谢两位
prstat 2008-04-30
  • 打赏
  • 举报
回复
应该不需要考虑双核问题,这是OS管的,你使用的是OS 的API而已,具体实现是OS做的
intel_www 2008-04-30
  • 打赏
  • 举报
回复
从你的描述来看浪费带宽的原因是由于某些网站速度很慢导致程序被阻塞在那里等待数据,而此时后面等待下载网页又由于单线程串行程序的属性而无法被下载,这样下载带宽就白白空闲了。使用多线程是一个解决这个问题的好办法。你现在面临的主要问题是到底同时创建多少个线程来同时下载多个页面。至于这些线程如何被调度到双核上执行,如1楼所说,这是OS来调度的。OS会自动将阻塞在网络I/O上的线程换出,同时调度可以下载数据的线程到CPU上执行。

对于线程数目的选取可以有多种选择,比如可以设定一个参数来指定同时连接,也就是下载线程的数目,然后让这些线程一起工作。这个参数本身可以设计成用户可调,然后用户可以根据经验值来反复调整,最后找到一个较好的设置。

另一种方式可以由程序本身监控当前一段时间内总的下载带宽,然后根据这个下载带宽和网络实际可用带宽(你这里是80K)的比较来实时动态的控制下载线程地数目。

这两种算法各有利弊,前者实现较简单,但需要做实验来获取合理配置参数,并且适应性较差;后者实现起来较为复杂,但适应性更好,比如同一条ADSL线在使用高峰期(比如傍晚)和非高峰期(比如半夜,凌晨)可用的带宽变化还是较大的。

你可以根据自己的要求和编程能力来合理选取一种。

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧