Запись в формат базы данных PostgreSQL без использования PostgreSQL - PullRequest
2 голосов
/ 09 июня 2011

Я собираю много данных с большого количества машин.Эти машины не могут запускать PostgreSQL и не могут подключаться к базе данных PostgreSQL.На данный момент я сохраняю данные с этих машин в CSV-файлах и использую команду COPY FROM для импорта данных в базу данных PostgreSQL.Даже на высокопроизводительном оборудовании этот процесс занимает часы.Поэтому я думал о записи данных непосредственно в формат базы данных PostgreSQL.Затем я просто скопировал бы эти файлы в каталог / data и запустил сервер PostgreSQL.Затем сервер найдет файлы базы данных и примет их как базы данных.

Возможно ли такое решение?

Ответы [ 3 ]

4 голосов
/ 09 июня 2011

Теоретически это может быть возможно, если вы внимательно изучите исходный код PostgreSQL.

Но вы, по сути, заканчиваете (пере) пишете ядро ​​PostgreSQL, которое, с моей точки зрения, считается «неосуществимым».

Редактировать:Возможно, вы захотите взглянуть на pg_bulkload , который утверждает, что он работает быстрее, чем COPY (хотя и не использовал его)

2 голосов
/ 09 июня 2011

Почему они не могут подключиться к серверу базы данных?Если это из-за библиотечных зависимостей, я предлагаю вам установить какое-то клиент-серверное решение (возможно, веб-сервисы), которое могло бы ставить в очередь и отправлять данные по пути.

Опираясь на пакетные операции, вы всегда будете испытывать головную боль при работе с большим объемом данных, и если COPY FROM не достаточно быстр для вас, я не думаю, что что-то будет.

1 голос
/ 10 июня 2011

Да, вы не можете просто записать файлы любым разумным способом.В дополнение к формату страницы данных вам необходимо будет реплицировать журналы фиксации, часть журналов упреждающей записи, некоторые части видимости транзакций, любой код преобразования для используемых вами типов и, возможно, код TOAST и код varlena.Да, и данные системного каталога, как уже упоминалось.Грубое предположение, вы можете обойтись только с заимствованием 200К строк кода с сервера.PostgreSQL с самого начала построен на расширяемости;Вы даже не можете интерпретировать, что означает целое число, не посмотрев сначала информацию о типе вокруг целочисленного типа в системном каталоге.

Есть несколько советов по ускорению процесса COPY при Массовая загрузка и восстановление.В частности, может помочь отключение synchronous_commit.Еще один полезный трюк: если вы начинаете транзакцию, TRUNCATE таблицы, а затем копируете в нее, то COPY идет намного быстрее.Это не беспокоит обычная защита журнала записи.Однако легко обнаружить, что COPY на самом деле является узким местом в производительности процессора, и с этим ничего не поделаешь.Некоторые люди разбивают входящий файл на части и запускают сразу несколько операций COPY, чтобы обойти это.

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

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