2014-09-01 3 views
1

У меня серьезная проблема с моими шаблонами. После некоторого теста я узнал, что самая медленная часть рендеринга - это миниатюры, создаваемые из sorl-thumbnail. Ниже выданная часть из моего шаблона:sorl-thumbnail - Медленный отрисовка шаблона

{% for listing in listings %} 
    <li class="pic_view"> 
     <ul> 
      <li class="picture"> 
       <a href="{% url 'listing' listing.id listing.title %}"> 
        {% thumbnail listing.get_picture "240x143" crop="center" as im %} 
         <img src="{{ im.url }}"> 
        {% empty %} 
         tc 
        {% endthumbnail %} 
        <div class="overlay"></div> 
       </a> 
      </li> 
      <li class="artist"> 
       <a href="{% url 'profile_artist' listing.artist_id listing.artist.user.first_name %}"> 
        {% thumbnail listing.artist.get_avatar "60x60" crop="center" as im %} 
         <img src="{{ im.url }}"> 
        {% empty %} 
         tc 
        {% endthumbnail %} 
       </a> 
      </li> 
     </ul> 
    </li> 
{% endfor %} 

В настоящее время у меня есть около 6 списков и ниже измеренное время для рендеринга:

- 8512 ms on first rendering 
- 4680 ms on reload 
- 112 ms when thumbnail tags are removed 

Можете ли вы дать мне несколько советов по этому вопросу. Число, указанное выше, измеряется с помощью Debug=True, но нет разницы, когда флаг False. Также в соответствии с Django документации, я включил в себя следующие TEMPLATE_LOADERS:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader', 
    ('django.template.loaders.cached.Loader', (
     'django.template.loaders.filesystem.Loader', 
     'django.template.loaders.app_directories.Loader', 
    )), 
) 
+0

Какой бэкэнд вы используете для сорла? есть разные варианты, но я считаю, что memcached или redis должны быть быстрее, чем использовать DB, особенно если у вас много записей. – petkostas

ответ

0

Sorl делает это за кулисами (глава в документации являются here, здесь TL; версия DR)

  1. Compute хеш-значение из исходного имени файла и опций
  2. Проверьте в базе данных, если этот хеш уже присутствует, если да, доставить связанное миниатюру
  3. Если нет, изменить размер изображения, сохранить его в месте СМИ, создать запись базы данных с хэш/имя файла ассоциации, поставить миниатюрами

Это, как говорится, 4,5 секунды на пару доступа к БД является wayyyyyy слишком долго. Здесь что-то происходит.

+0

Да, вы правы, но я не могу найти повода для этого. Я проверил время для запросов, и даже когда добавлены теги эскизов, время составляет около 32 мс-40 мс. –

0

Sorl Thumbnail генерирует уменьшенные изображения на лету, поэтому требуется много времени, чтобы создать эскизы с использованием кроны или сельдерея (предпочтительнее) с предпочтительными размерами. Существует пакет, который уже называется sorl-thumbnail-async, который делает то, что вы ищете, и использует сельдерей. Поэтому, если эскизы недоступны, отобразите фиктивное изображение, как только миниатюры будут доступны, они будут визуализированы. Также используйте memcached как бэкэнд для django, который действительно хорош с точки зрения производительности.

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