Добрый день!
Медленно работает скрипт в момент записи данных. На 800 строк уходит ~22 минуты. Причём первые 500 обрабатываются за 7 минут.
from datetime import datetime
from openpyxl import load_workbook
import xlsxwriter as xl
# Here other functions and variables
def my_script():
wb_input = load_workbook('objects.xlsx', read_only=True)
ws_input = wb_input.active
wb_output = xl.Workbook(f'try_{datetime.now().strftime("%Y-%m-%d")}.xlsx', {'constant_memory': True})
ws_output = wb_output.add_worksheet('Sheet1')
make_headers_and_format(wb_output, ws_output, list_of_columns)
j = 1
for i in range(1, ws_input.max_row + 1):
message = f'{datetime.now().strftime("%Y.%m.%d %H:%M:%S")} watching row {i}'
if is_valid(ws_input.cell(i, 21).value):
for col in range(len(list_of_columns)):
ws_output.write(j, col, ws_input.cell(i, col + 1).value)
j += 1
message = message + ' catched'
print(message)
wb_input.close()
wb_output.close()
Как локализовал проблему:
1. Сначала запись была на openpyxl с write_only. Замена на xlsxwriter сократила процесс на 2 минуты.
2. У меня есть парсер с xlsxwriter, который пишет данные со скоростью ~1000 строк за 5 минут. Но там точно известно, что сервер медленно отдаёт страницы.
3. Задержка в исполнении скрипта всегда идёт со строками, помеченными "catched". Составляет до 13 секунд.
4. На более мощном компьютере скрипт отрабатывает за ~17 минут.
Пример лога2021.08.14 20:30:58 watching row 471
2021.08.14 20:30:58 watching row 472
2021.08.14 20:30:58 watching row 473
2021.08.14 20:30:58 watching row 474
2021.08.14 20:30:58 watching row 475
2021.08.14 20:30:59 watching row 476
2021.08.14 20:30:59 watching row 477
2021.08.14 20:30:59 watching row 478 catched
2021.08.14 20:31:06 watching row 479
2021.08.14 20:31:06 watching row 480 catched
2021.08.14 20:31:10 watching row 481 catched
2021.08.14 20:31:15 watching row 482
2021.08.14 20:31:15 watching row 483 catched
2021.08.14 20:31:19 watching row 484
2021.08.14 20:31:19 watching row 485
2021.08.14 20:31:20 watching row 486 catched
2021.08.14 20:31:24 watching row 487 catched
2021.08.14 20:31:28 watching row 488 catched
2021.08.14 20:31:35 watching row 489
Как ускорить процесс записи данных? Может быть, есть библиотеки лучше?