2009-04-28 29 views
5

Verilerinin bir bölümünü, urllib2/BeautifulSoup kullanarak ayrıştırdığım harici bir web sitesinden alan bir Django görünümü var.Django önbelleğe alma - önleyici olarak yapılabilir mi?

Bu işlem oldukça pahalıdır, bu yüzden düşük düzeyde önbellek API'sini kullanarak önbelleğe ~ 5 dakika. Ancak, önbelleğe alınan veriler sona erdikten sonra siteye erişen her kullanıcı, yeni verileri ayrıştırmak için dış siteye giderken birkaç saniyelik önemli bir gecikme alacaktır.

Yeni verileri tembel bir şekilde yüklemek için herhangi bir kullanıcı, bu tür bir gecikme yaşanmayacak mı? Yoksa bu kaçınılmaz mı?

Lütfen paylaşılan bir barındırma sunucusunda olduğumu unutmayın, bu nedenle yanıtlarınızı aklınızda bulundurun.

DÜZENLEME: şimdiye kadarki yardım için teşekkürler. Yine de, bunu nasıl yapacağım konusunda python senaryosuyla nasıl yaptığımı bilmiyorum. Yaptığım temel bir test django önbelleğinin global olmadığını gösteriyor. Anlamını, bir dış komut dosyasından çağırırsam, çerçeve içinde devam eden önbellek verilerini görmez. Öneriler?

Başka bir EDIT: bunu düşünmeye geliyor, bu muhtemelen yerel bellek önbelleğini kullanıyorum. Önbelleği memcached'a götürürsem, her neyse, bunun çözüleceğinden şüpheleniyorum.

+0

Bu bağlamda tembel demek istediğinden emin değilim. Önbellek neredeyse her zaman tembelce doldurulur - yani sadece gerektiğinde. Bence diğer web sitelerinden tembel bir şekilde ayrıştırmaktan bahsediyorsun. –

cevap

8

Düzenli aralıklarla çalıştırılacak bir şeyler planlamak ister misiniz? Bazı CPU zamanlarında, this simple app'u kullanabilirsiniz. Bunu kullanmak eğer

Alternatif, her 5 dakika boyunca cron job geçerli:

*/5 * * * * /path/to/project/refresh_cache.py 

Web host bu kurma farklı yöntemler sağlar. CPanel için Cron Manager'ı kullanın. Google App Engine için cron.yaml'u kullanın. Tüm bunlar için, önce refresh_cache.py'da set up the environment'a ihtiyacınız olacak. Bu arada, bir kullanıcının isteğine yanıt vermek tembel önbellekleme olarak kabul edilir. Bu önbelleğe alma önbelleklemesidir. Ve sayfanın yeniden oluşturulması için yeterince önbellek almayı unutmayın!

4

"Ben arayacaktır piton komut dosyası ile bunu gerçekleştirmek nasıl hala olarak emin değilim."

sorunu birkaç saniye içinde "önemli gecikme Ben harici bir siteye giderken olmasıdır yeni verileri "ayrıştırmak" Django önbelleği ile hiçbir ilgisi yoktur.

Her yerde önbelleğe alabilir ve dış siteyi yeniden dağıtmaya gittiğinizde gecikme olur. Bir kullanıcı, sayfalarını beklerken harici siteyi ayrıştırmamaktır.

hüner bir kullanıcı bir sayfaya sorar önce dış siteyi ayrıştırılır. Zaman içinde geriye gidemediğinizden, harici siteyi periyodik olarak ayrıştırmanız ve çözümlenmiş sonuçları yerel bir dosyada veya bir veritabanında veya başka bir şeyde bırakmanız gerekir.

Bir kullanıcı bir istekte bulunduğunda, sonuçların getirilmiş ve ayrıştırılmış hali vardır ve yaptığınız her şey sunmaktır.

request = HttpRequest() 
request.path = url # the url of your view 
(detail_func, foo, params) = resolve(url) 
params['gmap_key'] = settings.GMAP_KEY_STATIC 
detail = detail_func(request, **params) 
out = open(dir + "index.html", 'w') 
out.write(detail.content) 
out.close() 

sonra cron

0

Ayrıca görünümünüzü arayıp bir dosyaya yazmak, sonra da örneğin lightpd ile staticaly onu teslim etmek için bir piton komut dosyasını kullanabilirsiniz kanıt yok, ama okuduğumda BeautifulSoup yavaş ve çok fazla hafıza tüketiyor. Bunun yerine lxml modülünü kullanarak bakmak isteyebilirsiniz. lxml'in daha hızlı ve verimli olması ve BeautifulSoup'dan çok daha fazlasını yapabilmesi gerekiyor. Tabii ki, ayrıştırma muhtemelen sizin darboğazınız değildir; harici G/Ç'dir.

Öncelikle, memcached kullanın! aşağıdaki gibi

Sonra kullanılabilir bir stratejidir: A denilen

  • önbelleklemiş nesne, (örneğin, A_<timestamp>) dinamik bir anahtarla önbellekte saklanır.
  • Başka bir önbelleğe alınmış nesne, A_key adı verilen A için geçerli anahtarı tutar.
  • Uygulamanız sonra, A_<timestamp> tuşlarıyla ve tamamlanmasıyla önbelleği doldurmak yeni anahtar
için A_key de değerini değiştirecek ilk A_key
  • bir periyodik süreç de değerini alarak A için anahtar alacağı

    Bu yöntemi kullanarak, tüm kullanıcılar her 5 dakikada bir önbelleğin güncellenmesini beklemek zorunda kalmazlar, yalnızca güncelleme gerçekleşene kadar eski sürümleri alırlar.

  • 4

    Birlikte Senaryonu çağırır:

    İlgili konular