【问题标题】:Fetching a large number of images, determining if they are broken or not获取大量图像,确定它们是否损坏
【发布时间】:2015-02-22 22:53:23
【问题描述】:

我的数据库中有大约 600,000 个帖子,所有帖子都包含指向图片的链接。在大约 1% 的这些帖子中,图像被破坏(它们已被删除或移动或其他)。我需要一种快速的方法来浏览所有图像并删除图像损坏的帖子。到目前为止,这是我的代码:

class Post < ActiveRecord::Base

  ..unrelated code truncated

  def self.clean_broken_images
    Post.with_image.find_each do |post|
      response = HTTP.get(post.image)
      post.destroy if response == 404
    end
  end

end

这可行,但正如您所料,它非常慢(我实际上还没有让它运行完成)。

有更快的方法吗?例如:只返回响应头,如果是 404 则删除?使用 Typhoeus/Hydra(不确定我能否为这么多的帖子做到这一点)?我还应该提到,我正在运行这个延迟作业。

谢谢!

【问题讨论】:

  • 您可以将HTTP.getHTTP.head 交换,看看会发生什么。
  • 没有“快速”的方法来做到这一点。您的代码受限于您的连接速度以及您要访问的主机的连接。而且,全速攻击您不拥有的主机是被禁止的好方法。相反,你需要善良,并随着时间的推移做到这一点。您可以使用 Hydra 和 Typhoeus 之类的东西并并行执行,允许它们管理同时允许的请求数。按域对您的请求进行排序,这样 Hydra 就可以将事情限制在合理的水平。 head 请求非常快,但不要淹没主机。

标签: ruby-on-rails ruby http ruby-on-rails-4 typhoeus


【解决方案1】:

您是否需要主动从数据库中删除帖子? 您可以等到他们被请求并使用一些 javascript 来加载图像。如果找不到图片,请让脚本向您的服务器发出 DELETE 请求以获取相应的帖子。

【讨论】:

  • 很好的解决方案!可能存在一些问题,因为我的 API 必须进行身份验证,但需要考虑一些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 2012-05-25
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多