Форум сайта python.su
B снова здравствуйте, форумчане!
Есть бд sqlite в ней 1 таблица, в таблице около 10кк записей.
Структура таблицы:
id|name|date1|date2|date3|text1|text2|text3|integer
Для записи информации в чистую таблицу уходит времени около ~ 1 часа
Мне нужно обновить 10к строк.
Попытки через алхимию и sqlite3 выполняются очень долго ~ 5-10 часов.
Встал вопрос, как это исправить, как ускорить этот процесс, т.е. сделать массовый update.
И еще вопрос, если использовать MySQL or PostgreSQL ускорит ли этот процесс и если ускорит, то насколько))))
Офлайн
Эмм. Какие-то цифры нереальные…
У меня база на 4000 товаров обновляется где-то до 4 минут. И она посложнее структурой чем Ваша в разы. И то это при том, что у меня базы просто на разных серверах, а скрипт работал через третий сервер - прослойку. Ну и можно существенно ускорить процесс проверкой необходимости обновления (изменились ли данные).
P.S. Да. С посгрессом будет быстрее.
Отредактировано 4kpt_III (Авг. 3, 2015 17:47:00)
Офлайн
Попытки через алхимию и sqlite3 выполняются очень долго ~ 5-10 часов.А как вы обновляете, покажите.
Офлайн
Вы, видимо, транзакцию фиксируете после каждой вставки/обновления
Офлайн
Вы надеюсь не по одной записи это делаете?
И индексы будут очень кстати. Перед тем как update сделать сервер сначала должен найти нужные записи.
В общем, код хочется посмотреть.
Офлайн
4kpt_III
Эмм. Какие-то цифры нереальные…У меня база на 4000 товаров обновляется где-то до 4 минут. И она посложнее структурой чем Ваша в разы. И то это при том, что у меня базы просто на разных серверах, а скрипт работал через третий сервер - прослойку. Ну и можно существенно ускорить процесс проверкой необходимости обновления (изменились ли данные).P.S. Да. С посгрессом будет быстрее.
def func_update(name,date1,text1): return '''UPDATE domains SET text1 = '%s', date1 = '%s' WHERE name = '%s'; ''' % (text1,str(date1),name) f = open(file_data, 'r') con = sqlite3.connect('%s' % path_db) cur = con.cursor() # Создаем объект-курсор sql = '' for line in f: arr = str(line).replace('\r', '').replace('\n', '').split(";") sql += str_update_ip_domain(arr[0], arr[1], arr[2]) if i % 1000 == 0: try: # обработка исключения cur.executescript(sql) # Выполняем SQL-запрос sql = '' except sqlite.DatabaseError, err: print u"Ошибка:", err # остаток try: cur.executescript(sql) # Выполняем SQL-запрос sql = '' except sqlite.DatabaseError, err: print u"Ошибка:", err cur.close() # Закрываем объект-курсора con.close() # Закрываем соединение f.close()
Офлайн
Пишите в базу небольшими порциями ( можете поексперементировать с размером порции ). Ну и индексы тоже хорошая вещь, если есть лишнее место на диске. И да, executescript каждый раз фиксирует транзакцию, а это замедляет скорость работы Вашей программы.
Офлайн
1) Как минимум по полю name нужен индекс
2) Я бы не стал хранить 10 000 000 записей в sqlite
Офлайн
aybНу фактически 10 вставок, а так разницы что по 2, что по 10, что по 1к update - скорость не сильно изменялась ~5%
Пишите в базу небольшими порциями ( можете поексперементировать с размером порции ). Ну и индексы тоже хорошая вещь, если есть лишнее место на диске. И да, executescript каждый раз фиксирует транзакцию, а это замедляет скорость работы Вашей программы.
RodegastДа я уже понял, что SQLlite - это не то, что нужно. Подкупило описание на сайте разраба - размер бд до 1ТБ (у меня то в 1к раз меньше).
1) Как минимум по полю name нужен индекс2) Я бы не стал хранить 10 000 000 записей в sqlite
Офлайн
> Да я уже понял, что SQLlite - это не то, что нужно. . . Знакомство с SQLite можно считать неудачным)
Индекс сделал?
Офлайн