Как оптимизировать загрузку миллионов записей в MongoDB с помощью Django admin?
У меня есть MongoDB с более чем 20 миллионами записей, интегрированная с Django администрированием. Оба сервиса работают в k8s. Я уже применил некоторые из приведенных ниже оптимизаций:
- Добавление NoCountPaginator (отключение подсчета)
- Индексирование MongoDB
- Сортировка набора запросов
Кроме того, я читал, что добавлять skip
и limit
не рекомендуется, так как это еще больше ухудшит производительность.
Но все же загрузка происходит крайне медленно и часто выдает ошибки таймаута.
Вот пользовательский менеджер для получения queryset
:
models.py
class RuleDataManagerRemoved(DjongoManager):
def get_queryset(self):
event_horizon = datetime.datetime.now() - datetime.timedelta(days=180)
return RuleDataQuerySet(model=self.model, using=self._db,
hints=self._hints).filter(last_change__gte=event_horizon)
Фильтрация происходит с полем indexed, поэтому я думаю, что влияние здесь не критично.
admin.py
@admin.register(models.ChangedProductSlugs)
class ChangedProductSlugsAdmin(RuleDataAdmin):
paginator = NoCountPaginator
show_full_result_count = False
list_display = ('old_category_slug', 'old_product_slug',
'new_category_slug', 'new_product_slug',
'tld', 'last_change', 'created_by', 'stav')
list_filter = ('last_change',
('old_product_slug', SingleTextInputFilterOldProduct),
('old_category_slug', SingleTextInputFilterOldCategory),
('new_product_slug', SingleTextInputFilterNewProduct),
('new_category_slug', SingleTextInputFilterNewCategory),
'deleted', 'deleted_by', 'tld')
search_fields = ('old_category_slug', 'old_product_slug',
'new_category_slug', 'new_product_slug')
resource_class = resources.ChangedProductSlugsResource
actions = ['restore_queryset']
def stav(self, obj):
return not obj.deleted
stav.boolean = True
def changelist_view(self, request, extra_context=None):
default_filter = False
try:
ref = request.META['HTTP_REFERER']
pinfo = request.META['PATH_INFO']
qstr = ref.split(pinfo)
if len(qstr) < 2:
default_filter = True
except:
default_filter = True
if default_filter:
q = request.GET.copy()
q['deleted__exact'] = '0'
request.GET = q
request.META['QUERY_STRING'] = request.GET.urlencode()
return super(ChangedProductSlugsAdmin, self).changelist_view(request, extra_context=extra_context)
Наследуемый класс не имеет отношения к получению данных, поскольку он также наследуется от ModelAdmin
с некоторыми дополнительными функциональными возможностями или миксинами.
На данный момент я не знаю, как улучшить производительность для быстрой загрузки. Спасибо за любую помощь.