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