История изменений
Исправление ism, (текущая версия) :
Можно, но все равно много лишнего. Например FileBasedCache пересчитывает количество файлов при вставке, что накладно даже для рам диска. Что касается чтения, то скорость с tmpfs и с обычной почти одинакова ибо кеш ФС
В общем shared memory хорошо, но на будущее, слишком много переделывать
Поэтому накатал изврат. Подсчет файлов в кеше редиса или подобного, это позволило убрать тормоза, но сохранить свойства FileBasedCache. Он ценен ещё тем, что не падает при многопоточных запросах. diskcache.DjangoCache много раз падал
import random
from django.core import cache
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from django.core.cache.backends.filebased import FileBasedCache
class MyFileBasedCache(FileBasedCache):
def __init__(self, dir, params):
"""
Кеш совмещает надёжность файлового кеша, скорость чтения, и не ограничен в размерах как FileBasedCache
FileBasedCache тормозил при большом количестве файлов, ибо считал их заново
Здесь же подсчёт перенесен на быстрый кеш
"""
super().__init__(dir, params)
self.default_cache = cache.caches['default']
self.cache_key = '981a50825cf542d9bafbdbabeb840410'
self.count_cache()
def _cull(self):
num_entries = self.default_cache.get(self.cache_key, 0)
if num_entries < self._max_entries:
return
if self._cull_frequency == 0:
return self.clear()
# Delete a random selection of entries
filelist = self._list_cache_files()
filelist = random.sample(filelist, int(num_entries / self._cull_frequency))
for fname in filelist:
self._delete(fname)
self.count_cache()
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
super().set(key, value, timeout, version)
res = self.default_cache.get(self.cache_key)
if not res:
self.count_cache()
self.default_cache.incr(self.cache_key)
def count_cache(self):
filelist = self._list_cache_files()
self.default_cache.set(self.cache_key, len(filelist), None)
Исправление ism, :
Можно, но все равно много лишнего. Например FileBasedCache пересчитывает количество файлов при вставке, что накладно даже для рам диска. Что касается чтения, то скорость с tmpfs и с обычной почти одинакова ибо кеш ФС
В общем shared memory хорошо, но на будущее, слишком много переделывать
Поэтому накатал изврат. Подсчет файлов в кеше редиса или подобного, это позволило убрать тормоза, но сохранить свойства FileBasedCache. Он ценен ещё тем, что не падает при многопоточных запросах. diskcache.DjangoCache много раз падал
import random
from django.core import cache
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from django.core.cache.backends.filebased import FileBasedCache
class MyFileBasedCache(FileBasedCache):
def __init__(self, dir, params):
"""
Кеш совмещает надёжность файлового кеша, скорость чтения, и не ограничен в размерах как FileBasedCache
FileBasedCache тормозил при большом количестве файлов, ибо считал их заново
Здесь же подсчёт перенесен на быстрый кеш
"""
super().__init__(dir, params)
self.default_cache = cache.caches['default']
self.cache_key = '981a50825cf542d9bafbdbabeb840410'
self.count_cache()
def _cull(self):
num_entries = self.default_cache.get(self.cache_key, 0)
if num_entries < self._max_entries:
return
if self._cull_frequency == 0:
return self.clear()
# Delete a random selection of entries
filelist = self._list_cache_files()
filelist = random.sample(filelist, int(num_entries / self._cull_frequency))
for fname in filelist:
self._delete(fname)
filelist = self._list_cache_files()
self.default_cache.set(self.cache_key, len(filelist), None)
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
super().set(key, value, timeout, version)
res = self.default_cache.get(self.cache_key)
if not res:
self.count_cache()
self.default_cache.incr(self.cache_key)
def count_cache(self):
filelist = self._list_cache_files()
self.default_cache.set(self.cache_key, len(filelist), None)
Исправление ism, :
Можно, но все равно много лишнего. Например FileBasedCache пересчитывает количество файлов при вставке, что накладно даже для рам диска. Что касается чтения, то скорость с tmpfs и с обычной почти одинакова ибо кеш ФС
В общем shared memory хорошо, но на будущее, слишком много переделывать
Поэтому накатал изврат. Подсчет файлов в кеше редиса или подобного, это позволило убрать тормоза, но сохранить свойства FileBasedCache. Он ценен ещё тем, что не падает при многопоточных запросах.
import random
from django.core import cache
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from django.core.cache.backends.filebased import FileBasedCache
class MyFileBasedCache(FileBasedCache):
def __init__(self, dir, params):
"""
Кеш совмещает надёжность файлового кеша, скорость чтения, и не ограничен в размерах как FileBasedCache
FileBasedCache тормозил при большом количестве файлов, ибо считал их заново
Здесь же подсчёт перенесен на быстрый кеш
"""
super().__init__(dir, params)
self.default_cache = cache.caches['default']
self.cache_key = '981a50825cf542d9bafbdbabeb840410'
self.count_cache()
def _cull(self):
num_entries = self.default_cache.get(self.cache_key, 0)
if num_entries < self._max_entries:
return
if self._cull_frequency == 0:
return self.clear()
# Delete a random selection of entries
filelist = self._list_cache_files()
filelist = random.sample(filelist, int(num_entries / self._cull_frequency))
for fname in filelist:
self._delete(fname)
filelist = self._list_cache_files()
self.default_cache.set(self.cache_key, len(filelist), None)
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
super().set(key, value, timeout, version)
res = self.default_cache.get(self.cache_key)
if not res:
self.count_cache()
self.default_cache.incr(self.cache_key)
def count_cache(self):
filelist = self._list_cache_files()
self.default_cache.set(self.cache_key, len(filelist), None)
Исходная версия ism, :
Можно, но все равно много лишнего. Например FileBasedCache пересчитывает количество файлов при вставке, что накладно даже для рам диска. Что касается чтения, то скорость с tmpfs и с обычной почти одинакова ибо кеш ФС
В общем shared memory хорошо, но на будущее, слишком много переделывать
Поэтому накатал изврат. Подсчет файлов в кеше редиса или подобного, это позволило убрать тормоза, но сохранить свойства FileBasedCache. Он ценен ещё многопоточностью
import random
from django.core import cache
from django.core.cache.backends.base import DEFAULT_TIMEOUT
from django.core.cache.backends.filebased import FileBasedCache
class MyFileBasedCache(FileBasedCache):
def __init__(self, dir, params):
"""
Кеш совмещает надёжность файлового кеша, скорость чтения, и не ограничен в размерах как FileBasedCache
FileBasedCache тормозил при большом количестве файлов, ибо считал их заново
Здесь же подсчёт перенесен на быстрый кеш
"""
super().__init__(dir, params)
self.default_cache = cache.caches['default']
self.cache_key = '981a50825cf542d9bafbdbabeb840410'
self.count_cache()
def _cull(self):
num_entries = self.default_cache.get(self.cache_key, 0)
if num_entries < self._max_entries:
return
if self._cull_frequency == 0:
return self.clear()
# Delete a random selection of entries
filelist = self._list_cache_files()
filelist = random.sample(filelist, int(num_entries / self._cull_frequency))
for fname in filelist:
self._delete(fname)
filelist = self._list_cache_files()
self.default_cache.set(self.cache_key, len(filelist), None)
def set(self, key, value, timeout=DEFAULT_TIMEOUT, version=None):
super().set(key, value, timeout, version)
res = self.default_cache.get(self.cache_key)
if not res:
self.count_cache()
self.default_cache.incr(self.cache_key)
def count_cache(self):
filelist = self._list_cache_files()
self.default_cache.set(self.cache_key, len(filelist), None)