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

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

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

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

P.S. Да. С посгрессом будет быстрее.
FishHook
Попытки через алхимию и sqlite3 выполняются очень долго ~ 5-10 часов.
А как вы обновляете, покажите.
PooH
Вы, видимо, транзакцию фиксируете после каждой вставки/обновления
pwsa
Вы надеюсь не по одной записи это делаете?

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

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

Индекс сделал?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB