2015-04-30 3 views
2

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

  1. данных PARSE из XMLs
  2. Соберите строку (ы)
  3. Вставить строку (ы) для Postgres

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

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

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

ответ

0

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

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

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