0

(原谅我英语不好)

我在特定范围的 URL 上运行自定义网络爬虫。我正在对其进行测试,到目前为止一切正常。

最近我注意到一个我想讨论的性能问题 - 机器人正在爬取在 url_pool 表中索引的页面,同时在目标页面中搜索目标内容,如果它们不在表中,机器人会保存它们找到的页面链接已经...我在操作多个爬网脚本(同时)时遇到了一些冲突问题,但我修复了它。

在爬取了大约 150 万页后,我的 url_pool 表包括近 5M 行,其中包含 url、一些“标志”、url 哈希(simhash - 32 位)、域等......

mysql db 表是具有大缓冲区的 innodb,并且根据搜索查询的索引很好。我在监控机器人的性能时注意到,我用来防止表中重复 url 的“检查是否存在”功能越来越慢。我知道很明显,表越大,在其中搜索所需的时间就越长,但现在看到执行时间的增加似乎还为时过早。

如果我总结表现:

  • url_pool~100K ROWS -> 整个爬取过程(1页)0.8s。
  • url_pool~800K ROWS -> 1.1s
  • url_pool~1.8M ROWS -> 1.9s
  • url_pool~3.5M ROWS -> 3.2s
  • url_pool~5M ROWS -> 4.8s

另一个重要的事实是,在检查表中是否存在 url 时我没有使用文本搜索,我正在创建哈希,然后将其与表中的其他人匹配,我遵循了我在构建爬虫的早期阶段收到的建议,并发现它提高了性能。

现在,每页 1.9 秒是票价(考虑同时运行 4 个机器人),但 5 秒太慢了......

你能给我建议吗?

编辑:

更多信息:

我使用一个:

SELECT EXISTS(SELECT 1 FROM table1 WHERE ...)

对于索引列上的搜索查询(在文档中建议获得更快的结果),表结构是一个非常简单的表

  • ID

  • 链接(varchar 400)

  • link_simhash (varchar 32)

  • 域(varchar 200)

  • 标志 1(布尔)

  • 标志 2(铃)

  • bot_visit (int)

  • date_found (日期)

  • date_crawled (日期)

正如我所说,where 指的是链接哈希。

有任何想法吗???没有人???我的问题有什么问题???

4

0 回答 0