Как эффективно разделить большие объекты python между запросами в Django?

Я хотел бы поделиться некоторыми большими объектами python в Django. Это просто большие таблицы данных, к которым я хотел бы быстро получить произвольный доступ в памяти. Подумайте о том, чтобы просто прочитать dict размером, скажем, 35M на диске. То есть, не огромные, но и не маленькие. Я рассматриваю их как неизменяемые. То есть, считывать при инициализации, никогда их не менять. Я готов перезапустить сервер, чтобы получить изменения.

Какой лучший, наиболее удобный для Django способ сделать это?

Этот вопрос похож на мой. В этом ответе описано, как использовать низкоуровневый внутрипамятный кэш Django. Читая документацию, там есть in-memory cache, который является in-process и thread-safe. Идеально. Однако, However, только объекты, которые можно травить. Я не хочу, чтобы мой 35-мегабайтный объект python мариновался, это кажется неудобным. И потом, если его вытащить обратно, он снова распикируется? Каждый запрос? Это звучит медленно.

В этом сообщении блога упоминается django-lrucache-backend, который пропускает pickling. Однако последний раз он был обновлен 2 года назад, и в нем также говорится, что его не следует использовать для "больших таблиц данных" (не знаю почему).

Рекомендации?

В зависимости от объекта, который вы хотите сохранить, вам нужно пикетировать и распикетировать. Но это не является проблемой производительности. У вас есть две возможности, если это диктант, вы можете использовать JSON структуру, в противном случае просто используйте django-redis в качестве бэкенда кэша и позвольте django хранить объект в кэше (redis). Django-redis поддерживает также пулинг соединений.

В итоге я повесил свои данные на объект Django AppConfig, а именно на метод ready.

Другие тоже, кажется, так делают, например здесь. В этом примере не используется метод ready, но используется AppConfig.

Вернуться на верх