Я работаю над веб-приложением с очень агрессивным кэшированием. Практически каждый компонент веб-приложения: представления, частичные представления, выходные данные контроллера, загрузка диска, вызовы REST-API, запросы к базе данных. Все, что может быть кэшировано на любом уровне, кэшируется с использованием декораторов.
Естественно, это невероятно быстро, так как подавляющее большинство генерации HTML состоит из чистых функций, с очень небольшой загрузкой из дискового / REST API. Кроме того, те немногие загрузки диска / запросы к базе данных / запросы REST API, которые я выполняю, также кэшируются до тех пор, пока не будут признаны недействительными, поэтому, если что-то просто не изменилось, они тоже очень быстрые.
Так что все работает быстро, но есть загвоздка: все это кэшируется в памяти, в одном огромном глобальном словаре в моем процессе WSGI, и, следовательно, может храниться напрямую без сериализации. Как только я начинаю помещать вещи в memcached, время, затрачиваемое на попадания в кеш, не сильно меняется, но помещение вещей в кеш начинает занимать гораздо больше времени. В целом это нормально, но начальная генерация «заполняющего кэша» каждой страницы идет от ~ 900 мс (что уже довольно быстро, учитывая, сколько плоских файлов она читает с диска) до ~ 9000 мс. Для справки, генерация произвольной страницы занимает около 10 мс после прогрева кеша.
Профилируя код, подавляющее большинство времени идет на cPickle. Итак, вопрос в том, как я могу сделать это быстрее? Существуют ли кеши в памяти, в которые я могу напрямую передавать свои объекты без сериализации? Или какой-нибудь способ ускорить кэширование моей огромной кучи объектов? Я мог бы просто обойтись без постоянного memcached, но тогда моя производительность (или ее отсутствие) будет зависеть от менеджера процессов Apache / WSGI.