Caching sitemaps v Django

hlasů
8

Jsem implementoval jednoduchou sitemapy třídu pomocí výchozí sitemapy aplikaci Django je. Jak to bylo příliš dlouho vykonat, jsem přidal ruční ukládání do mezipaměti:

class ShortReviewsSitemap(Sitemap):
    changefreq = hourly
    priority = 0.7

    def items(self):
        # try to retrieve from cache
        result = get_cache(CACHE_SITEMAP_SHORT_REVIEWS, sitemap_short_reviews)
        if result!=None:
            return result

        result = ShortReview.objects.all().order_by(-created_at)

        # store in cache
        set_cache(CACHE_SITEMAP_SHORT_REVIEWS, sitemap_short_reviews, result)

        return result

    def lastmod(self, obj):
        return obj.updated_at

Problém je v tom, že nebo mezipaměti umožňuje pouze max 1MB objekt. Tenhle byl větší, že 1 MB, takže ukládání do vyrovnávací paměti se nezdařilo:

>7 SERVER_ERROR object too large for cache

Problém je v tom, že django má automatizovaný způsob rozhodování o tom, kdy by měla rozdělit soubor Sitemap do těch smalled. Podle dokumentů ( http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/ ):

Ty by měly vytvořit soubor indexu, pokud jeden z vašich souborů Sitemap obsahuje více než 50.000 adres URL. V tomto případě bude Django automaticky stránkování sitemap a index bude odrážet.

Co myslíš, že by bylo nejlepší způsob, jak umožnit ukládání do mezipaměti Sitemaps? - Hacking do rámce Django Sitemaps omezit pouze jednu velikost Sitemap na, řekněme, 10.000 záznamů jeví jako nejlepší nápad. Proč byl 50,000 vybrán v první řadě? Google radu? náhodných čísel? - Nebo možná existuje způsob, jak umožnit Memcached ukládání větších souborů? - Nebo možná onces uložen, sitemaps by měly být k dispozici ve formě statických souborů? To by znamenalo, že namísto ukládání do mezipaměti s Memcached budu muset ručně uložit výsledky v souborovém systému a získávat odtud příštím okamžiku, kdy je požadována sitemap (snad čištění adresář denně cron).

Všichni ti, se zdají být velmi nízké úrovni a já jsem přemýšlel, jestli existuje zřejmá řešení ...

Položena 17/01/2010 v 03:46
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
14

50k to není hardcore parametr. :)

Místo toho můžete použít tuto třídu django.contrib.sitemaps.GenericSitemap

class LimitGenericSitemap(GenericSitemap):
    limit = 2000
Odpovězeno 23/03/2010 v 11:45
zdroj uživatelem

hlasů
2

Za předpokladu, že nebudete potřebovat všechny tyto stránky v mapě webu pak snížení limitu dostat velikost souboru dolů bude fungovat dobře, jak je popsáno v předchozí odpovědi.

Chcete-li po velmi velký Sitemap a chcete používat Memcached byste mohli rozdělit obsah do několika bloků, jejich uložení pod jednotlivými klávesami a pak dát je znovu dohromady na výstupu. Aby to bylo efektivnější Memcached podporuje schopnost získat více kláves najednou, i když si nejsem jistý, zda klient django podporuje tuto funkci dosud.

Pro srovnání limit 1 mb je funkce Memcached dělat s tím, jak to ukládá data: http://code.google.com/p/memcached/wiki/FAQ#What_is_the_maximum_data_size_you_can_store?_(1_megabyte)

Odpovězeno 27/03/2010 v 00:48
zdroj uživatelem

hlasů
1

Můžete sloužit sitemaps také v gzip formátu, což z nich dělá mnohem menší. XML se hodí perfektně pro kompresi gzip. To, co jsem někdy to: Vytvoření gzip soubor (y) Sitemap v cronjob a činí tak často, jak to nezbytné. Obvykle jednou denně bude stačit. Kód pro toto může vypadat například takto. Jen se ujistěte, aby se vaše sitemap.xml.gz sloužil z kořenové domény:

    from django.contrib.sitemaps import GenericSitemap
    from django.contrib.sitemaps.views import sitemap
    from django.utils.encoding import smart_str
    import gzip
    sitemaps = {
        'page': GenericSitemap({'queryset': MyModel.objects.all().order_by('-created'), 'date_field': 'created'}),
    }
    f = gzip.open(settings.STATIC_ROOT+'/sitemap.xml.gz', 'wb')
    f.write(smart_str(sitemap(request, sitemaps=sitemaps).render().content))
    f.close()

To by mělo dostat jste začali.

Odpovězeno 06/12/2015 v 22:10
zdroj uživatelem

hlasů
1

Mám asi 200.000 stránek na mých stránkách, takže jsem musel mít index bez ohledu na to, co se děje. Skončil jsem dělat výše hack, omezení sitemap 250 odkazů, a také provádění mezipaměti souborů na bázi.

Základní algoritmus je následující:

  • Pokusit se načíst soubor Sitemap ze souboru na disku
  • Pokud to nepomůže, generování sitemap, a
  • V případě, že mapa stránek obsahuje 250 odkazů (číslo vyšší než stanovené), uložit na disk a pak jej vrátit.

Konečným výsledkem je, že první doba Sitemap je požadováno, pokud je to kompletní, to je generován a uložen na disk. Až se příště to požadováno, je to prostě sloužil z disku. Vzhledem k tomu, můj obsah se nikdy nezmění, to funguje velmi dobře. Nicméně, pokud chci změnit Sitemap, je to tak jednoduché jako odstranění souboru (y) z disku, a čeká na prohledávače přijít regenerovat věci.

Kód pro celou věc je zde, pokud máte zájem: http://bitbucket.org/mlissner/legal-current-awareness/src/tip/alert/alertSystem/sitemap.py

Možná, že to bude dobré řešení pro vás.

Odpovězeno 19/08/2010 v 08:56
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more