Форум сайта python.su
Есть скрипт с Django на простой логике:
def task(order_id): order = Orders.objects.get(pk=order_id) cache, created = OrderIndexer.objects.get_or_create(order=order_id) cache.name = order.country_from_name # и так далее cache.save() del order del cache rs = Orders.objects.filter() for row in rs: task(row.id) del row
Офлайн
VadimK
первым делом попробуйте принудительно коммитить транзакцию
во-вторых, если вы экономите пямять, то зачем делаете select *? Используйте only и defer, например,
order = Orders.objects.filter(pk=order_id).only("name")[0]
cache = OrderIndexer.objects.filter(order__in=Orders.objects.filter(pk=order_id).only("id"))
VadimKвы их не удаляете принудительно, вы их помечаете для удаления для сборщика мусора, сам сборщик никуда не девается. Попробуйте его отключить
Попытки принудительно удалять объекты ничего не дают.
Офлайн
Это не весь скрипт, там десятки полей включая текстовые. Данные агрегируются для поиска, формируются json объекты для последующего использования и т.п. Это ни каким одним запросом не сделать.
Если правильно понимаю, внутри task() формируются объекты cache, order - далее помечаются как удаленные и отправляются в память. Следующим вызовом формируются новые, снова помечаются и так далее по циклу.
gc.collect() в цикле в общем то решило проблему, рост минимальный
Офлайн