LINUX.ORG.RU

python/sqlite долго обновляет базу


0

1

вкратце:
есть очередь запросов на обновление БД (UPDATE ...)
процесс их обрабатывает, обновляя базу

очередь переполняется, он не успевает все обработать, делает это слишком медленно

сделал тестовый скрипт:

size: 31 n: 469 time: 0.0000948905944824218750
size: 30 n: 470 time: 0.000092983245849609375
size: 29 n: 471 time: 0.0000920295715332031250
size: 28 n: 472 time: 0.0001099109649658203125
size: 27 n: 473 time: 0.0633759498596191406250 ***

тут видно что на один запрос типа UPDATE table... — тратится примерно 0.00009

а когда делаем commit() — 0.06337

в реальном же скрипте начинаем с 0.835566997528076171875
и со временем тот же запрос выполняется уже 1.2133929729461669921875

код буду и дальше упрощать, хотя хз что там ещё можно упростить
а узнать хочу вот что — есть какие-нибудь сторонние средства отследить работу с базой? т.е вдруг её какой-то левый процесс при этом дергает и не дает ей обновиться?

может у самого sqlite есть какой-нибудь дебаг-режим, чтобы все запросы к базе валились на экран? чтобы увидеть лишние, если они есть

или как-то отследить все возможные локи?
мой процесс ставит RLock на каждый execute()
а вот commit() правда делает без лока. но в целях оптимизации коммит делается только каждый 10-ый запрос




есть очередь запросов на обновление БД (UPDATE ...)
процесс их обрабатывает, обновляя базу

нужно обновлять батчами, по 1000 записей сразу. а ты делаешь по одной, я угодал?

Karapuz ★★★★★
()
Ответ на: комментарий от Karapuz

вообще система должна не только делать апдейты

я думал про то чтобы юзать executemany, хотя бы для апдейтов, но изначально хотел просто найти причину, по которой очередь не успевает обрабатываться

сначала её обрабатывал Thread, я изменил его на Process из multiprocessing, но скорости это не прибавило

если не получится найти и искоренить узкое место, из-за которого простой апдейт длится 1.5 секунды, то потом уже сделаю executemany

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

а может тормозной пифон на каждый обдейт открывает соединение с бд, ждет пока запись залочится, апдейтит, закрывает соединение? и так по новой. откуда мы знаем?

Karapuz ★★★★★
()

решение: сделать индекс по таблице, которую обновляет питон
в таблице 800к записей
запросы с 1-2 сек. стали выполняться за 0.0005 сек.

sergey-novikov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.