2014-09-01 93 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的緩存後端,這在性能方面非常出色。