neitro
Авг. 3, 2015 17:13:56
B снова здравствуйте, форумчане!
Есть бд sqlite в ней 1 таблица, в таблице около 10кк записей.
Структура таблицы:
id|name|date1|date2|date3|text1|text2|text3|integer
Для записи информации в чистую таблицу уходит времени около ~ 1 часа
Мне нужно обновить 10к строк.
Попытки через алхимию и sqlite3 выполняются очень долго ~ 5-10 часов.
Встал вопрос, как это исправить, как ускорить этот процесс, т.е. сделать массовый update.
И еще вопрос, если использовать MySQL or PostgreSQL ускорит ли этот процесс и если ускорит, то насколько))))
4kpt_III
Авг. 3, 2015 17:46:32
Эмм. Какие-то цифры нереальные…
У меня база на 4000 товаров обновляется где-то до 4 минут. И она посложнее структурой чем Ваша в разы. И то это при том, что у меня базы просто на разных серверах, а скрипт работал через третий сервер - прослойку. Ну и можно существенно ускорить процесс проверкой необходимости обновления (изменились ли данные).
P.S. Да. С посгрессом будет быстрее.
FishHook
Авг. 3, 2015 17:59:43
Попытки через алхимию и sqlite3 выполняются очень долго ~ 5-10 часов.
А как вы обновляете, покажите.
PooH
Авг. 3, 2015 18:43:19
Вы, видимо, транзакцию фиксируете после каждой вставки/обновления
pwsa
Авг. 3, 2015 19:03:35
Вы надеюсь не по одной записи это делаете?
И индексы будут очень кстати. Перед тем как update сделать сервер сначала должен найти нужные записи.
В общем, код хочется посмотреть.
neitro
Авг. 3, 2015 19:55:04
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()
ayb
Авг. 3, 2015 20:11:22
Пишите в базу небольшими порциями ( можете поексперементировать с размером порции ). Ну и индексы тоже хорошая вещь, если есть лишнее место на диске. И да, executescript каждый раз фиксирует транзакцию, а это замедляет скорость работы Вашей программы.
Rodegast
Авг. 3, 2015 20:35:41
1) Как минимум по полю name нужен индекс
2) Я бы не стал хранить 10 000 000 записей в sqlite
neitro
Авг. 3, 2015 21:15:57
ayb
Пишите в базу небольшими порциями ( можете поексперементировать с размером порции ). Ну и индексы тоже хорошая вещь, если есть лишнее место на диске. И да, executescript каждый раз фиксирует транзакцию, а это замедляет скорость работы Вашей программы.
Ну фактически 10 вставок, а так разницы что по 2, что по 10, что по 1к update - скорость не сильно изменялась ~5%
Rodegast
1) Как минимум по полю name нужен индекс2) Я бы не стал хранить 10 000 000 записей в sqlite
Да я уже понял, что SQLlite - это не то, что нужно. Подкупило описание на сайте разраба - размер бд до 1ТБ (у меня то в 1к раз меньше).
Сейчас перепишу под PostgreSQL. Знакомство с SQLite можно считать неудачным)
Rodegast
Авг. 3, 2015 22:09:11
> Да я уже понял, что SQLlite - это не то, что нужно. . . Знакомство с SQLite можно считать неудачным)
Индекс сделал?