Найти - Пользователи
Полная версия: Django. Queryset. SQLite. помогите оптимизировать код.
Начало » Python для новичков » Django. Queryset. SQLite. помогите оптимизировать код.
1
gtlhbkkj
написал очень неэффективный но работающий код
Программа работала дольше суток.
Задержка в основном при обработке таблицы, в которой 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)

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

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

С первой функцией сложнее… Если расскажешь словами, что она делает, может и можно будет что-то придумать.
gtlhbkkj
Striver
Очень трудно понять, что же в этих функциях на самом деле происходит, .
извиняйте, это полностью функции, у них нет продолжения, которое я вырезал. Это очень простые и короткие функции но похоже очень неэффективные. Чуть позже когда чуть времени больше будет подробно опишу что они должны делать. Так как данную задачу нужно было решить одноразово, то 24 часа на обработку - приемлемо. Спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB