Я реализовал простой класс карты сайта, используя стандартное приложение карты сайта django. Поскольку выполнение заняло много времени, я добавил ручное кэширование:
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
Проблема в том, что memcache допускает использование только 1 МБ объекта. Этот размер был больше, чем 1 МБ, поэтому сохранение в кэш не удалось:
>7 SERVER_ERROR object too large for cache
Проблема в том, что у django есть автоматизированный способ решить, когда он должен делить файл карты сайта на меньшие. По документам (http://docs.djangoproject.com/en/dev/ref/contrib/sitemaps/):
Вы должны создать индексный файл, если он
из ваших файлов Sitemap более 50 000
URL-адрес. В этом случае Джанго будет
автоматически разбивать карту сайта на страницы,
и индекс будет отражать это.
Как вы думаете, что будет лучшим способом включить кэширование файлов Sitemap?
- Взломать инфраструктуру django sitemaps, чтобы ограничить один размер файла, скажем, до 10 000 записей, кажется лучшей идеей. Почему 50 000 были выбраны в первую очередь? Гугл совет? случайный номер?
- Или, может быть, есть способ, позволяющий memcached хранить большие файлы?
- Или, возможно, сохраненные файлы должны быть доступны в виде статических файлов? Это будет означать, что вместо кэширования с использованием memcached мне придется вручную сохранять результаты в файловой системе и извлекать их оттуда в следующий раз при запросе карты сайта (возможно, ежедневная очистка каталога в задании cron).
Все это кажется очень низким уровнем, и мне интересно, существует ли очевидное решение ...