2015-02-22 4 views
2

У меня около 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 (не уверен, что я могу сделать это для этого огромного количества сообщений)? Я должен также упомянуть, что я выполняю это с отложенными заданиями.

Спасибо!

+1

Вы можете просто заменить 'HTTP.get' на' HTTP.head' и посмотреть, что произойдет. – Mori

+2

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

ответ

2

Вам нужно упреждающее удаление Сообщений из базы данных? Вы можете подождать, пока они не будут запрошены, и использовать некоторый javascript для загрузки изображений. Если изображение не может быть найдено, попросите сценарий выполнить запрос DELETE на ваш сервер для соответствующего сообщения.

+0

Хорошее решение! Могут быть некоторые проблемы, так как мой API должен иметь аутентификацию, но об этом думать. – goddamnyouryan

 Смежные вопросы

  • Нет связанных вопросов^_^