Ruby / Rails: необходимо обрабатывать изменение размера загружаемых изображений с достойной производительностью - PullRequest
1 голос
/ 06 января 2011

Я создаю приложение в Rails, которое позволяет пользователям загружать изображения в свои галереи. Изображения отображаются в 3 размерах (на данный момент: оригинал, средний, большой палец) и меняются по размеру (я использую carrierwave и minimagick) по мере загрузки каждого файла, а новые размеры сохраняются на s3.

Первые пару созданных мною прототипов были мучительно медленными при тестировании с более чем 50 загруженными фотографиями одновременно или когда одновременно загружалось много людей.

Вот два возможных решения, о которых я думаю:

  1. Попросите пользователей загрузить изображения оригинального размера в S3, а затем используйте прокси-сервер для изменения размера изображения, чтобы изменить размер изображений других размеров. Первоначально изменение размера выполняется на лету, затем кэшируется с использованием Squid или Varnish.

  2. Загрузите исходные изображения пользователей на S3, затем установите приложение для изменения размера изображений (встроенное в sinatra или что-то маленькое и быстрое), которое может обрабатывать какие-либо очереди (возможно, с использованием delayed_job), обрабатывать изображения и сохранять их S3, и уведомлять основное приложение об обработке (чтобы пользователи были уведомлены о том, что они готовы и могут быть показаны на сайте).

Меня больше всего волнует пользовательский опыт, поэтому чем быстрее, тем лучше. Я склоняюсь к # 1, так как это означает, что люди могут получить доступ к галерее, как только они сделали загрузку.

Может ли кто-нибудь пролить какой-либо опыт / свет на то, что может быть лучше всего?

Ответы [ 5 ]

3 голосов
/ 06 января 2011

Вместо внешнего приложения я бы использовал отложенное задание.

https://github.com/tobi/delayed_job

1 голос
/ 31 января 2013

Вы могли бы также рассмотреть несущую-vips. Во всяком случае, на моем компьютере это примерно в 6 раз быстрее, чем минимак. В этом репо есть несколько тестов:

https://github.com/stanislaw/carrierwave-vips-benchmarks

1 голос
/ 07 января 2011

Какой метод изменения размера вы используете? В RMagick стандартный метод изменения размера довольно медленный. Существует метод, называемый «sample», который является самым быстрым методом изменения размера, но конечный результат будет немного страшнее. Я не знаю, относится ли то же самое к MiniMagick, но я думаю, что это так, поскольку он также использует ImageMagick. :)

См. Эту ссылку для некоторых сравнений (для RMagick): http://rmagick.rubyforge.org/resizing-charts.html

И я согласен с Нерианом. Вы должны попробовать delayed_job, чтобы поставить вещи в очередь. Это очень простой в использовании гем, и я успешно использовал его в некоторых приложениях. Удачи!

1 голос
/ 06 января 2011

Я предполагаю, что вы используете ImageMagick для масштабирования ваших изображений. ImageMagick очень, очень медленный (но по функциям это удивительно). Я подозреваю, что вы сможете масштабировать свои проблемы на лету, если вы используете более быструю библиотеку, такую ​​как gd. Я хотел бы рассмотреть попытку http://gd2.rubyforge.org/.

0 голосов
/ 01 марта 2012

В конце концов, я перешел к использованию Resque - он выглядит немного более дружелюбным, чем Delayed Job, и действительно влияет на скорость загрузки и изменения размера изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...