Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 3, 2015 17:13:56

neitro
Зарегистрирован: 2015-03-13
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовый update

B снова здравствуйте, форумчане!
Есть бд sqlite в ней 1 таблица, в таблице около 10кк записей.
Структура таблицы:
id|name|date1|date2|date3|text1|text2|text3|integer
Для записи информации в чистую таблицу уходит времени около ~ 1 часа

Мне нужно обновить 10к строк.
Попытки через алхимию и sqlite3 выполняются очень долго ~ 5-10 часов.
Встал вопрос, как это исправить, как ускорить этот процесс, т.е. сделать массовый update.

И еще вопрос, если использовать MySQL or PostgreSQL ускорит ли этот процесс и если ускорит, то насколько))))

Офлайн

#2 Авг. 3, 2015 17:46:32

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Массовый update

Эмм. Какие-то цифры нереальные…
У меня база на 4000 товаров обновляется где-то до 4 минут. И она посложнее структурой чем Ваша в разы. И то это при том, что у меня базы просто на разных серверах, а скрипт работал через третий сервер - прослойку. Ну и можно существенно ускорить процесс проверкой необходимости обновления (изменились ли данные).

P.S. Да. С посгрессом будет быстрее.

Отредактировано 4kpt_III (Авг. 3, 2015 17:47:00)

Офлайн

#3 Авг. 3, 2015 17:59:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Массовый update

Попытки через алхимию и sqlite3 выполняются очень долго ~ 5-10 часов.
А как вы обновляете, покажите.



Офлайн

#4 Авг. 3, 2015 18:43:19

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Массовый update

Вы, видимо, транзакцию фиксируете после каждой вставки/обновления



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#5 Авг. 3, 2015 19:03:35

pwsa
Зарегистрирован: 2015-07-24
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовый update

Вы надеюсь не по одной записи это делаете?

И индексы будут очень кстати. Перед тем как update сделать сервер сначала должен найти нужные записи.

В общем, код хочется посмотреть.

Офлайн

#6 Авг. 3, 2015 19:55:04

neitro
Зарегистрирован: 2015-03-13
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовый update

4kpt_III
Эмм. Какие-то цифры нереальные…У меня база на 4000 товаров обновляется где-то до 4 минут. И она посложнее структурой чем Ваша в разы. И то это при том, что у меня базы просто на разных серверах, а скрипт работал через третий сервер - прослойку. Ну и можно существенно ускорить процесс проверкой необходимости обновления (изменились ли данные).P.S. Да. С посгрессом будет быстрее.

У меня 10 000 000 записей) Почти 1ГБ файл

Код приблизительно такой
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()

Офлайн

#7 Авг. 3, 2015 20:11:22

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Массовый update

Пишите в базу небольшими порциями ( можете поексперементировать с размером порции ). Ну и индексы тоже хорошая вещь, если есть лишнее место на диске. И да, executescript каждый раз фиксирует транзакцию, а это замедляет скорость работы Вашей программы.

Офлайн

#8 Авг. 3, 2015 20:35:41

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2793
Репутация: +  185  -
Профиль   Отправить e-mail  

Массовый update

1) Как минимум по полю name нужен индекс
2) Я бы не стал хранить 10 000 000 записей в sqlite



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#9 Авг. 3, 2015 21:15:57

neitro
Зарегистрирован: 2015-03-13
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

Массовый update

ayb
Пишите в базу небольшими порциями ( можете поексперементировать с размером порции ). Ну и индексы тоже хорошая вещь, если есть лишнее место на диске. И да, executescript каждый раз фиксирует транзакцию, а это замедляет скорость работы Вашей программы.
Ну фактически 10 вставок, а так разницы что по 2, что по 10, что по 1к update - скорость не сильно изменялась ~5%
Rodegast
1) Как минимум по полю name нужен индекс2) Я бы не стал хранить 10 000 000 записей в sqlite
Да я уже понял, что SQLlite - это не то, что нужно. Подкупило описание на сайте разраба - размер бд до 1ТБ (у меня то в 1к раз меньше).
Сейчас перепишу под PostgreSQL. Знакомство с SQLite можно считать неудачным)

Офлайн

#10 Авг. 3, 2015 22:09:11

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2793
Репутация: +  185  -
Профиль   Отправить e-mail  

Массовый update

> Да я уже понял, что SQLlite - это не то, что нужно. . . Знакомство с SQLite можно считать неудачным)

Индекс сделал?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version