LINUX.ORG.RU

ускорить в рамках Python вставки INSERT ON CONFLICT

 , ,


0

2

Когда реализовал загрузку таблички в Postgres таким образом: с помощью pandas считал все данные и сохранил их в csv-файл и затем загрузил с помощью engine.raw_connection().cursor().copy_from() от sqlalchemy. При это табличка дропается и создается заново. Работает быстро (несколько минимут), но возникла проблема - кончается оперативная память. Датафрейм уже занимает под 10 G и вынужден перейти к дописыванию таблички.

При дописывании возникает проблема. Строки таблицы с последнего момента записывания меняются (глубина несколько суток). Поэтому использую «INSERT ON CONFLICT UPDATE» в Питоновском цикле с execute от sqlalchemy. Все работает, но бесконечно долго. 10 тыс. записей висят несколько часов. Порекомендуйте как ускорится можно?

но возникла проблема - кончается оперативная память

Чанками вставлять?

Порекомендуйте как ускорится можно?

Если задача позволяет, а кмк, она позволяет, сменить БД может быть на колоночную, кликхаус будет вставлять csv-ку «со скоростью чтения файла с диска».

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

будет вставлять csv-ку «со скоростью чтения файла с диска»

Так это все базы, если лочить и без проверок.

Shadow ★★★★★
()

Датафрейм уже занимает под 10 G

Сколько всего строк? И попробуй dask поверх пандаса.

Shadow ★★★★★
()
Ответ на: комментарий от Shadow

У ТС пандас, наверняка, какие-то серийные данные, да и изначально он вставляет всё скопом заново, должно ему зайти.

vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

Попробуй писать пачками через COPY.

А COPY может обновить существующую в таблице запись - уникальный id? Или всетаки, без удалил таблицу - создал таблицу задачка не решается?

В итоге я хотел бы дописывать и обновлять существующую таблицу порциями (пока это Postgres).

PS. пробую через временную таблицу заинсертить с конфликтом … странным кажеться решение, но похоже сработает

scisearcher
() автор топика
Последнее исправление: scisearcher (всего исправлений: 1)
Ответ на: комментарий от Shadow

Спасибо за dask. Если не решается задачка без удаления и создания заново таблицы, заюзаю.

scisearcher
() автор топика
Ответ на: комментарий от scisearcher

В итоге, мгновенно работает схема дописывания:

pandas -> csv -> postgres_tmp_table -> postgres_table

запись в postgres_table реализовал через INSERT FROM postgres_tmp_table ON CONFLICT DO UPDATE.

Не знаю, почему-то решение кажется костыльным, но наверное для Постгреса это нормально. Топик пока не буду закрывать, может поделитесь опытом.

scisearcher
() автор топика
Последнее исправление: scisearcher (всего исправлений: 1)
Ответ на: комментарий от cobold

Не знаю, мне не приходится много грузить из пандаса в постгри, так как я веду обработку и очистку данных прямо на стороне БД (sql запросами, иногда динамическими), а вот наоборот часто делать приходится. Но читать с pg в pandas лучше через csv который правда в оперативку кладётся (через COPY в запросе и io в python-е), а не на диск. Сильно быстрее выходит (в несколько раз). И это именно какая-то болячка пандаса, связанная с выделением памяти. Подозреваю что наоборот тоже так же работает. При этом чем грузить не важно. Что sqlalchemy что psycopg2 лагают примерно одинаково (sqlalchemy чуть больше, но это на единицы процентов разница). А вот csv ускоряет в разы.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от cobold

df.to_sql() висит очень долго + не умеет upsert. А при некотором критическом количестве элементов перестает работать …

scisearcher
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.