У меня около 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' и посмотреть, что произойдет. – Mori
Существует не «быстрый» способ сделать это. Ваш код ограничен скоростью вашего соединения и соединением хоста (ов), на которое вы нажимаете. И, поражая хозяев, которых вы не владеете на полной скорости, это хороший способ быть запрещенным. Вместо этого вам нужно быть добрым и делать это со временем. Вы * можете * использовать что-то вроде Hydra и Typhoeus и делать это параллельно, позволяя им управлять количеством запросов, разрешаемых одновременно. Отсортируйте ваши запросы по домену, чтобы Hydra могла затем держать вещи в дросселе на разумном уровне. Запросы 'head' очень быстры, но не пугают хосты. –