XML для Postgres через python/psycopg2

77
5

У меня есть существующий скрипт python, который проходит через каталог XML файлов, анализируя каждый файл с помощью etree и вставляя данные в разные точки в схему базы данных Postgres с использованием модуля psycopg2. Этот скрипт с взломом работал очень хорошо, но теперь количество данных (количество и размер файлов XML) быстро растет, а количество операторов INSERT просто не масштабируется. Самая большая таблица в моей последней базе данных выросла примерно до 50 миллионов записей из примерно 200 000 XML файлов. Поэтому мой вопрос: какой наиболее эффективный способ:

Анализ данных из XML Сборка строк (строк) Вставить строки (строки) в Postgres

Будет ли быстрее записывать все данные в CSV в правильном формате, а затем загружать итоговые таблицы CSV в Postgres, используя команду COPY_FROM?

В противном случае я думал о заселении некоторой временной структуры данных в памяти, которую я мог бы вставить в БД, когда достигнет определенного размера? У меня просто возникает проблема с тем, как это будет работать.

Спасибо за любое понимание этой темы, и, пожалуйста, дайте мне знать, нужна ли дополнительная информация для ответа на мой вопрос.

спросил(а) 2021-01-19T22:26:08+03:00 6 месяцев назад
1
Решение
89

copy_from является самым быстрым способом, который я нашел, чтобы делать объемные вставки. Вы могли бы уйти от потоковой передачи данных через генератор, чтобы держаться подальше от записи временных файлов, сохраняя при этом низкий уровень использования памяти.

Функция генератора может собирать строки из данных XML, а затем потреблять этот генератор с помощью copy_from. Вы даже можете захотеть нескольких уровней генераторов, чтобы у вас был один, который дает записи из одного файла, а другой - из всех 200 000 файлов. У вас будет один запрос, который будет намного быстрее, чем 50 000 000.

Я написал здесь ответ со ссылками на пример и контрольный код для установки чего-то подобного.

ответил(а) 2021-01-19T22:26:08+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема