【问题标题】:Which is more efficient - hitting my db or doing an extra web crawl and hitting an array?哪个更有效 - 访问我的数据库或进行额外的网络爬网并访问数组?
【发布时间】:2012-06-20 07:02:06
【问题描述】:

我有一个网络爬虫,它会查找我想要的特定信息并将其返回。这是每天运行。

问题是我的爬虫必须做两件事。

  1. 获取它必须抓取的链接。
  2. 抓取上述链接并将内容推送到数据库。

#1 的问题是,总共有 700 多个链接。这些链接不会经常更改 - 可能一个月一次?

因此,一种选择是每月对“链接列表”进行一次单独的爬网,然后将链接转储到数据库中。

然后,让爬虫每天对这 700 个链接中的每一个进行 db hit。

或者,我可以只在我的爬虫中进行嵌套爬取 - 每次爬虫运行时(每天),它都会更新 700 个 URL 的列表并将其存储在一个数组中,然后从这个数组中提取它来进行爬取每个链接。

哪个对 Heroku 或任何主机更高效且负担更少?

【问题讨论】:

  • 等等,什么不经常改变:要抓取的链接上的内容,或者你必须抓取的链接集?我不确定我是否理解您的问题或替代方案。
  • 要抓取的链接集变化不大。
  • 所以你的问题是:哪个“更好”,从本地数据库获取 700 行,还是执行返回这 700 个命中的 HTTP 请求?

标签: ruby-on-rails ruby nokogiri


【解决方案1】:

这取决于您如何衡量“效率”和“征税”,但本地数据库命中几乎肯定比 HTTP 请求 + 解析链接的 HTML(?) 响应更快和“更好”。

此外,这可能并不重要,但是(假设您的数据库和适配器支持它)您可以开始遍历数据库请求结果并处理它们,而无需等待或将整个集合提取到内存中。

网络延迟和资源将比戳已经坐在那里、正在运行并且设计为高效快速查询的数据库要糟糕得多。

但是:每天一次?是否有充分的理由花费精力优化此任务?

【讨论】:

  • 很有趣,你能告诉我更多关于分页查询 db 请求结果的信息吗?我在生产中使用 PostgreSQL、ActiveRecord 和 Heroku。
  • 700 个链接甚至不需要分页 :)
  • @marcamillion 我在想Sequel::Dataset#each“迭代数据集中的记录,因为它们是从数据库适配器产生的”,而不是像 @987654325 这样的东西@ 这将需要在迭代开始之前获取整个集合并将其加载到 Ruby 数组中。
  • ActiveRecord 有find_eachthe guides 也有更多内容。但正如 Sergio 所说,700 条记录并不多(除非它们每条都包含大量数据)。
  • 有趣。我会调查这些。我明白你的意思 Phrogz。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2015-10-18
  • 2017-09-24
  • 2010-11-01
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多