Заполнение базы данных PostgreSQL большим количеством данных - PullRequest
1 голос
/ 26 января 2011

У меня есть база данных PostgreSQL с определенной структурой, и у меня есть несколько миллионов XML-файлов. Я должен разобрать каждый файл и получить определенные данные и заполнить таблицы в базе данных. То, что я хочу знать, является наиболее оптимальным языком / структурой / алгоритмом для выполнения этой процедуры.
Я написал программу на C # (Mono), используя DbLinq ORM. Он не использует многопоточность, он просто анализирует файл за файлом, сопоставляет объекты таблицы и передает определенную группу объектов (например, 200) в базу данных. Кажется, что он довольно медленный: он обрабатывает около 400 файлов в минуту, и на завершение работы уходит около месяца.
Прошу ваших мыслей и советов.

Ответы [ 2 ]

1 голос
/ 26 января 2011

Я думаю, что будет быстрее, если вы будете использовать маленькие программы в конвейере, который будет:

  • объедините ваши файлы в один большой поток;

  • анализирует входной поток и генерирует выходной поток в формате COPY PostgreSQL - тот же формат, который использует pg_dump при создании резервных копий, аналогично значениям, разделенным табуляцией, выглядит так:

COPY table_name (table_id, table_value) FROM stdin;
1   value1
2   value2
3   value3
\.
  • загрузка потока COPY в Postgresq, запущенный временно с опцией "-F" для отключения вызовов fsync.

Например, в Linux:

find -name \*.xml -print0 | xargs -0 cat \
  | parse_program_generating_copy \
  | psql dbname

Использование COPY намного быстрее, чем вставка с ORM. Присоединение файлов распараллелит чтение и запись в базу данных. Отключение «fsync» позволит значительно увеличить скорость, но потребует восстановления базы данных из резервной копии, если во время загрузки произойдет сбой сервера.

0 голосов
/ 26 января 2011

Обычно я считаю, что Perl - хороший вариант для разбора задач.Я не знаю Perl сам.Мне кажется, что у вас настолько высокие требования к производительности, что вам может потребоваться создать XML-анализатор, поскольку производительность стандартного анализатора может стать узким местом (вы должны проверить это, прежде чем приступить к реализации).Я сам использую Python и psycopg2 для связи с Postgres.

Какой бы язык вы ни выбрали, вы наверняка захотите использовать COPY FROM и, возможно, stdin, используя Perl / Python / другой язык для подачи данных в Postgres.

Вместо того, чтобы тратить много времени на оптимизацию всего, вы также можете использовать неоптимальное решение и запускать его крайне параллельно, скажем, на 100 экземплярах EC2.Это было бы намного дешевле, чем тратить часы на поиск оптимального решения.

Ничего не зная о размере файлов 400 файлов в минуту, это не кажется СЛИШКОМ плохим.Спросите себя, стоит ли потратить неделю на разработку, чтобы сократить время до трети, или просто запустить его сейчас и подождать месяц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...