Форум сайта python.su
привет.
Проект на джанго. БД 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)
Офлайн
Офлайн
а почему у емня не правильно?
У меня будет все медленно работать? Мой код сломает БД или что?
Офлайн
ilnurВряд ли сломает, хотя по мне создавать запись с жестко заданным id - идея не самая удачная.
а почему у емня не правильно?У меня будет все медленно работать? Мой код сломает БД или что?
for id, value in input_data: pole = Model.objects.get_or_create(id=id) pole.update(value=value)
Офлайн
исходные данные в 1 посте условные. В реальности иногда необходимо обновить не малое количесвто записей. И хотелось узнать, чем мой алгоритм плох.
Может его как то отпимизировать можно. Ато если обновлять ~200-300 тыс записей, То скрипт работает 3-5 часов.
FishHookт.е писать sql запросы самому?
Это может средствами БД лучше сделать?
Офлайн
Ильнур, Джанговский ОРМ совершенно не предназначен для твоей задачи. С том смысле, что сама Джанга не предусматривает одномоментного обновления сотен тысяч записей, она не для этого. Само по себе 3-5 часов работы скрипта уже говорит, что что-то тут не то. Я уверен где-то на 97%, что твои чаяния можно впихнуть в один SQL-запрос и он выполнится меньше чем за минуту.
Не! Можно забивать гвозди микроскопом, только зачем?
Отредактировано FishHook (Авг. 19, 2013 17:12:38)
Офлайн
Если в момент импорта данных никто более не может создавать новые записи, то логично вытащить ID всех существующих записей в память и решать делать update или create просто смотря ID в полученном списке.
Далее, сервер постгреса настроен или с дефолтными настройками?
Ну и вообще если надо очень быстро сделать множественный update, то нужно всякие хаки применять, например:
1) читаем данные из таблицы в память или файл
2) обновляем эти данные в памяти-файле за счёт новых данных
3) создаём новую таблицу в памяти
5) копируем туда данные из памяти-файла черещ LOAD DATA
6) далее старую таблицу удаляем и новой таблице даём имя старо таблицы
Офлайн
Добавлю к тому, что сказали выше.
ilnurМне кажется, основной тормоз тут коммит для каждой записи.
Может его как то отпимизировать можно. Ато если обновлять ~200-300 тыс записей, То скрипт работает 3-5 часов.
Офлайн
reclosedevскорее всего да.
тут коммит для каждой записи.
Офлайн
ilnurСмотря какой сервер и насколько тяжелы объекты, но я бы начал с нескольких сотен, может даже тысячи.
допустим 10-20 записей
ilnur@transaction.commit_manually уже давно есть.
p.s. django 1.3
Офлайн