最近在写一个网络爬虫的Java程序,想从多个网页上拿数据,然后写到一个文件里?
因为数据量挺多的,所以想考虑优化的问题。
所以问下常见的优化思路是怎么样的?(应该有多个思路吧,比如说用到线程什么的)
一般爬行可以根据运行的环境是单机或者是分布式设定工作的线程数,同时需要一个爬行过页面的索引,因为是多线程,爬过的就需要跳过。
还有就是索引可以将爬下来的内容进行多个文件存储,因为单个文件存储不但查询会很慢(多文件可以先遍历文件名再遍历内容,单个文件需要遍历全部内容)。
优化的方向有几个:
1、解析的算法,网页爬下来后需要抽出里面的内容,去掉不用的标签
2、索引和存储的算法,索引考虑用url进行索引,至于多少内容怎么存储可以参考开源
3、参与计算的设备数量,单机的话建议cpu核数差不多的线程就好了,多的有没太多提高。还可以用Hadoop的集群运行的自己的java程序。就是弄好多计算机联合计算,连线程都不用设置了
暂时想到这么多
有成熟的框架,比如nutch这个java的,里面包含了爬行的算法,线程,页面的内容解析存储。可以参考下,比自己闷头写要好。
一般是开多个工作线程同时抓取,这个数量在几个到十几个线程,再多就没意义,起不到加速的作用了。
文件读写是独占的,可以同时读多个文件,但是想同时写入同一个文件是不行的。
每个网页拿取的速度不一样,架设这多个网页的数据权重是一样的,不区分先后顺序的话,当然是谁先读取完,用谁的。
所以是写文件的程序等待下载程序下载完网页内容,写入一个队列,写程序从队列中读取要写入的文件,开始写入。
其实就是一个生产消费服务。
楼主没有提到是多少网站,多少网页,数据多少,也没有说多少线程,多少cpu还是服务器跑java进程。那么这样优化是优化java代码。
多层for循环,里面次数多,外面次数少,效率高。三元运算比if else效率高一点点。尽量不要让代码运算,比如5*5,直接写上25。多线程可以共享方法。但是不要修改。。。。。。。。。。。。。