Форум сайта python.su
2
написал очень неэффективный но работающий код
Программа работала дольше суток.
Задержка в основном при обработке таблицы, в которой 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)
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)
Офлайн
22
Очень трудно понять, что же в этих функциях на самом деле происходит, но не лучше ли загрузить всё в Пандас и обрабатывать в памяти вместо базы данных?
Конкретно по оптимизации сходу легко посоветовать только по поводу последней функции. Там в цикле нужно заполнять списки нулёвых объектов, а потом с помощью метода bulk_create одномоментно загонять их в БД.
С первой функцией сложнее… Если расскажешь словами, что она делает, может и можно будет что-то придумать.
Офлайн
2
Striverизвиняйте, это полностью функции, у них нет продолжения, которое я вырезал. Это очень простые и короткие функции но похоже очень неэффективные. Чуть позже когда чуть времени больше будет подробно опишу что они должны делать. Так как данную задачу нужно было решить одноразово, то 24 часа на обработку - приемлемо. Спасибо
Очень трудно понять, что же в этих функциях на самом деле происходит, .
Офлайн