Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 27, 2020 17:03:16

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Django. Queryset. SQLite. помогите оптимизировать код.

написал очень неэффективный но работающий код
Программа работала дольше суток.
Задержка в основном при обработке таблицы, в которой 12 столбцов и 100.000 строк со строковыми данными в каждой ячейке типа “qwert”, … “ABCDE”.
Таблица в SQLite, который по описанию без проблем работает с миллионом строк или макс значение строк 2 в 64 степени

первый кусок говнокода:

 def get_next_list(k):
    choices=list(BigTable.objects.all().filter(Q(field1__exact=k) | Q(field2__exact=k)
                ).values_list('field1', 'field2', 'field3',
                )
                )
    choice=[]
    for ch in choices:
        ch=set(ch)   # удалить повторяющиеся члены
	if "" in ch:
            ch.remove("") # удалить пустые члены
        if "ABC" in ch:
            ch.remove("ABC") # удалить какой-то конкретный член
        choice=choice + list(ch)
    choice=set(choice)
    return list(choice)

этот первый кусок собирает список, потом по этому списку еще раз проходит по таблице, список увеличивается и может вырасти до 500 штук в списке.

потом беру этот список
 choices = ["qwert", ... "ABCDE", ...]
и обрабатываю его своим вторым куском говнокода, при этом вносятся изменения в большую таблицу

 def update_records_in_bigtable(uid_br_next, choices):
    for k in choices:
        q = BigTable.objects.all().filter(Q(field1__exact=k) | 
            Q(field1__exact=k) | Q(field3__exact=k) & Q(field3=0)
            ).update(uid_nr=uid_nr_next)

и третий кусок говнокода распределяет полученный список по двум другим таблицам

 def add_records_to_crossreftable(choices, obj):
    for k in choices:
        try:
	    x = CrossRefTable.objects.create(field1=k, uid_nr_foreign=obj)
        except:
            x = DuplicatesTable.objects.create(field1=k)

Пожалуйста дайте совет по улучшению кода

Отредактировано gtlhbkkj (Апрель 27, 2020 18:50:13)

Офлайн

#2 Апрель 29, 2020 09:54:14

Striver
От:
Зарегистрирован: 2006-10-26
Сообщения: 247
Репутация: +  22  -
Профиль   Отправить e-mail  

Django. Queryset. SQLite. помогите оптимизировать код.

Очень трудно понять, что же в этих функциях на самом деле происходит, но не лучше ли загрузить всё в Пандас и обрабатывать в памяти вместо базы данных?

Конкретно по оптимизации сходу легко посоветовать только по поводу последней функции. Там в цикле нужно заполнять списки нулёвых объектов, а потом с помощью метода bulk_create одномоментно загонять их в БД.

С первой функцией сложнее… Если расскажешь словами, что она делает, может и можно будет что-то придумать.



Офлайн

#3 Май 1, 2020 21:33:15

gtlhbkkj
Зарегистрирован: 2019-09-20
Сообщения: 173
Репутация: +  2  -
Профиль   Отправить e-mail  

Django. Queryset. SQLite. помогите оптимизировать код.

Striver
Очень трудно понять, что же в этих функциях на самом деле происходит, .
извиняйте, это полностью функции, у них нет продолжения, которое я вырезал. Это очень простые и короткие функции но похоже очень неэффективные. Чуть позже когда чуть времени больше будет подробно опишу что они должны делать. Так как данную задачу нужно было решить одноразово, то 24 часа на обработку - приемлемо. Спасибо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version