Как сжать данные при использовании оператора копирования psql?

Моя цель — эффективно импортировать большие объемы данных в базу данных Postgres. В принципе, необработанные данные можно сжать примерно в 20 раз (например, с помощью gzip).

Оператор COPY кажется лучшим вариантом для массового импорта.

Помимо sslcompression (которое применяется после шифрования данных), существует ли способ сжатия фактических данных (контента), передаваемых между клиентом и сервером, или он даже встроен по умолчанию?

Большое спасибо.

(Не имеет значения, но я использую golang).

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

Adrian Klaver 13.04.2023 17:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

COPY [TO|FROM] PROGRAM позволяет использовать gzip как программу, если она установлена ​​в доступном для процесса сервера postgres месте: https://www.postgresql.org/docs/current/sql-copy.html#id-1.9.3.55. 10.

Вы также можете использовать COPY TO|FROM STDIN и выполнить распаковку/сжатие на стороне клиента.

Синопсис предполагает, что PROGRAM 'command' и STDIN можно использовать только исключительно. Насколько я понимаю, это означает, что я НЕ МОГУ читать сжатые данные из STDIN, передавать их через программу gzip и оттуда в таблицу. Сжатые данные должны присутствовать на сервере. Правильный?

Markus Rother 13.04.2023 23:31

только программы, которые будут выполняться PROGRAM, должны присутствовать на сервере. Вы можете использовать copy from program 'curl SOME_URL.zip | gunzip' или что-то в этом роде

Florian Klein 14.04.2023 10:24

да PROGRAM также передает вывод на стандартный ввод, что подразумевает стандартный ввод. И действительно, postgres не понимает содержимое gzip, его нужно передавать в несжатом виде (будь то текстовое или двоичное), но вы можете сделать распаковку в непосредственной близости от серверного процесса с помощью copy from program, что может быть лучше, чем отправлять его в распакованном виде с клиента.

Florian Klein 14.04.2023 10:28
Ответ принят как подходящий

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

Другие вопросы по теме

Скопируйте определенное изображение из нескольких изображений, содержащихся в разных подпапках, в определенной папке (Пакетная обработка)
Как скопировать атрибуты файла из одного файла в другой в Java?
Я пытаюсь скопировать данные из 7 разных листов (в одной книге) в один лист под названием «Объединить»
Как скопировать свойства одного класса в другой в javascript, включая методы
Копирование значений из одного подмножества во все остальные для выбранных столбцов с помощью dplyr
Скопировать текущий исполняемый файл в другой путь C++ (только для Windows)
Почему копирование и вставка в окнах меняют символы в длинном тексте?
Копировать каталог рекурсивно и перезаписывать все файлы без подтверждения пользователя
Скопируйте шаблон на новый лист с именем из ячейки
Код VBA для перемещения столбцов только недавно вставленных строк данных