2014-09-01 90 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应该比使用数据库更快,特别是如果你有很多条目。 – petkostas 2014-09-01 09:38:49

回答

0

SORL做这一幕后(在文档的章节是here,这里是TL; DR版)

  1. 计算从原始文件名和选项 给出的散列值
  2. 检查数据库中是否存在该散列,如果是, 传递相关缩略图
  3. 如果不是,调整图像,将其存储在媒体上的位置,创建一个哈希/文件名相关联的 数据库记录,交付 缩略图

话虽这么说,4.5秒一对夫妇的数据库查找的是wayyyyyy太久了。这里还有别的事情要做。

+0

是的,你是对的,但我找不到任何理由。我已经检查了查询的时间,甚至当添加缩略图标签时,时间大约是32ms-40ms。 – 2014-09-01 10:36:35

0

Sorl缩略图即时生成缩略图,因此耗时的操作,您需要的是使用cronjob或芹菜(首选)和首选大小创建缩略图。有一个包叫做sorl-thumbnail-async,它可以做你正在寻找和使用芹菜的东西。因此,如果缩略图不可用,只要缩略图可用,就会显示虚拟图像,它们将被渲染。还可以将memcached用作django的缓存后端,这在性能方面非常出色。