Какие есть хорошие способы загрузить большое количество пространственных данных в Postgis?

#postgresql #spatial #postgis #spatial-index

#postgresql #пространственный #postgis #пространственный индекс

Вопрос:

У меня есть большой объем пространственных данных, которые мне нужно проанализировать и использовать в приложении. Исходные данные представлены в формате WKT, и я оборачиваю их в инструкции INSERT SQL для загрузки данных.

 INSERT INTO sp_table ( ID_Info, "shape") VALUES ('California', , ST_GeomFromText('POLYGON((49153 4168, 49154 4168, 49155 4168, 49155 4167, 49153 4168))'));
  

Однако этот подход занимает слишком много времени, а данные большие (10 миллионов строк).
Итак, есть ли какой-либо другой способ загрузить большое количество пространственных данных?

Приветствуются любые хаки и хитрости для ускорения.

Ответ №1:

Вставьте свой текстовый файл в таблицу (с соответствующими столбцами) с помощью COPY

Добавьте ПОСЛЕДОВАТЕЛЬНЫЙ ПЕРВИЧНЫЙ КЛЮЧ к этой таблице, если в ней его нет

ВАКУУМ

Создайте по одному процессу на процессор, который выполняет это :

 INSERT INTO sp_table ( ID_Info, "shape")
SELECT state_name, ST_GeomFromText( geom_as_text )
FROM temp_table
WHERE id % numbre_of_cpus = x
  

Используйте разное значение «x» для каждого процесса, чтобы обрабатывалась вся таблица. Это позволит каждому ядру работать с медленной функцией ST_GeomFromText.

Создайте индекс GIST после вставки.

Ответ №2:

Здесь вы можете найти несколько общих советов по производительности. Возможно, у вас включено свойство fsync, и каждая INSERT команда вынуждена физически записываться на жесткий диск, вот почему это занимает так много времени.

Не рекомендуется отключать fsync (особенно в производственных средах), поскольку это позволяет безопасно восстанавливать данные после неожиданного сбоя ОС. Согласно документу:

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

Комментарии:

1. КОПИРОВАНИЕ выполняется быстрее, и все советы хороши. Отключение fsync может привести к повреждению.