Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 19, 2013 14:07:25

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Правильно ли я работаю с БД

привет.

Проект на джанго. БД postgresql
необходимо обновить таблицу в БД, исходные данные это id и значение поля, всего около 100 тысяч записей.
я заполнял все это так

for id, value in input_data:
    pole = Model.objects.filter(id=id)
    if pole.exists():
        pole[0].value = value
        pole[0].save()
    else:
        Model(id=id, value=value).save()

правильно ли я все делаю?

Отредактировано ilnur (Авг. 19, 2013 14:08:02)

Офлайн

#2 Авг. 19, 2013 14:17:31

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

Правильно ли я работаю с БД

Офлайн

#3 Авг. 19, 2013 14:27:56

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Правильно ли я работаю с БД

а почему у емня не правильно?

У меня будет все медленно работать? Мой код сломает БД или что?

Офлайн

#4 Авг. 19, 2013 15:01:03

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

Правильно ли я работаю с БД

ilnur
а почему у емня не правильно?У меня будет все медленно работать? Мой код сломает БД или что?
Вряд ли сломает, хотя по мне создавать запись с жестко заданным id - идея не самая удачная.
Я про то, что код можно сильно сократить и “облагородить”.

for id, value in input_data:
    pole = Model.objects.get_or_create(id=id)
    pole.update(value=value)

А вообще задача какая-то странная. Это может средствами БД лучше сделать?



Офлайн

#5 Авг. 19, 2013 15:05:47

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Правильно ли я работаю с БД

исходные данные в 1 посте условные. В реальности иногда необходимо обновить не малое количесвто записей. И хотелось узнать, чем мой алгоритм плох.
Может его как то отпимизировать можно. Ато если обновлять ~200-300 тыс записей, То скрипт работает 3-5 часов.

FishHook
Это может средствами БД лучше сделать?
т.е писать sql запросы самому?
если да, то джанговсикй орм же формирует сам sql b dsgjkyztn/
или я чего не понял.

мне проще и быстрее на орм написать, + в процессе работы скрипта удобно вести всяки лог файл.

Офлайн

#6 Авг. 19, 2013 17:11:07

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

Правильно ли я работаю с БД

Ильнур, Джанговский ОРМ совершенно не предназначен для твоей задачи. С том смысле, что сама Джанга не предусматривает одномоментного обновления сотен тысяч записей, она не для этого. Само по себе 3-5 часов работы скрипта уже говорит, что что-то тут не то. Я уверен где-то на 97%, что твои чаяния можно впихнуть в один SQL-запрос и он выполнится меньше чем за минуту.
Не! Можно забивать гвозди микроскопом, только зачем?



Отредактировано FishHook (Авг. 19, 2013 17:12:38)

Офлайн

#7 Авг. 19, 2013 18:55:00

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Правильно ли я работаю с БД

Если в момент импорта данных никто более не может создавать новые записи, то логично вытащить ID всех существующих записей в память и решать делать update или create просто смотря ID в полученном списке.

Далее, сервер постгреса настроен или с дефолтными настройками?

Ну и вообще если надо очень быстро сделать множественный update, то нужно всякие хаки применять, например:
1) читаем данные из таблицы в память или файл
2) обновляем эти данные в памяти-файле за счёт новых данных
3) создаём новую таблицу в памяти
5) копируем туда данные из памяти-файла черещ LOAD DATA
6) далее старую таблицу удаляем и новой таблице даём имя старо таблицы

Офлайн

#8 Авг. 19, 2013 19:38:48

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Правильно ли я работаю с БД

Добавлю к тому, что сказали выше.

ilnur
Может его как то отпимизировать можно. Ато если обновлять ~200-300 тыс записей, То скрипт работает 3-5 часов.
Мне кажется, основной тормоз тут коммит для каждой записи.

Одно из решений - db.transaction.commit_manually
http://python.su/forum/post/95829/

В той же теме небольшой тест скорости:
http://python.su/forum/post/96024/

Офлайн

#9 Авг. 19, 2013 19:55:20

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

Правильно ли я работаю с БД

reclosedev
тут коммит для каждой записи.
скорее всего да.
на каждую запись по транзакции, так ведь?
можно в одной транзакции обработать допустим 10-20 записей, для надежностинадо будет потестить это.

p.s. django 1.3

Офлайн

#10 Авг. 19, 2013 20:02:50

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Правильно ли я работаю с БД

ilnur
допустим 10-20 записей
Смотря какой сервер и насколько тяжелы объекты, но я бы начал с нескольких сотен, может даже тысячи.

ilnur
p.s. django 1.3
@transaction.commit_manually уже давно есть.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version