如何使用 Python 提高在 PostGIS 中插入数据的效率?

How increate efffciency insert data in PostGIS with Python?

我需要在合适的时间内将 4600 万个点插入 PostGIS 数据库。插入 1400 万个点执行了大约 40 分钟,这很糟糕而且效率很低。

我用空间 GIST 索引创建了数据库并写了这段代码:

import psycopg2
import time

start = time.time()

conn = psycopg2.connect(host='localhost', port='5432', dbname='test2', user='postgres', password='alfabet1')

filepath = "C:\Users\nmt1m.csv"
curs = conn.cursor()
with open(filepath, 'r') as text:
    for i in text:
        i = i.replace("\n", "")
        i = i.split(sep=" ")
        curs.execute(f"INSERT INTO nmt_1 (geom, Z) VALUES (ST_GeomFromText('POINTZ({i[0]} {i[1]} {i[2]})',0), {i[2]});")
conn.commit()
end = time.time()

print(end - start)

curs.close()
conn.close()

我正在寻找插入数据的最佳方式,它不一定是 python。

谢谢 ;)

切希奇!欢迎来到 SO。

您可以采取一些措施来加快批量插入的速度:

  1. 如果目标 table 为空或未在生产系统中使用,请考虑在插入数据之前立即删除索引。插入完成后,您可以重新创建它们。这将避免 PostgreSQL 在每次插入后重新索引您的 table,在您的情况下这意味着 4600 万次。

  2. 如果目标 table 可以完全从您的 CSV 文件构建,请考虑创建一个 。未记录的 tables 比“正常”tables 快得多,因为它们(顾名思义)没有记录在 WAL 文件(预写日志)中。未记录的 table 可能会在数据库崩溃或不正常关机的情况下丢失!

  3. 使用 @MauriceMeyer 指出的 PostgreSQL command or copy_from。如果由于某种原因你必须坚持插入,请确保你没有在每次插入后提交 ;-)

干杯

感谢 Jim 的帮助,根据您的说明,更好的插入数据的方法是:

import psycopg2
import time

start = time.time()
conn = psycopg2.connect(host='localhost', port='5432', dbname='test2',
user='postgres', password='alfabet1')
curs = conn.cursor()
filepath = "C:\Users\Jakub\PycharmProjects\test2\testownik9_NMT\nmt1m.csv"

curs.execute("CREATE UNLOGGED TABLE nmt_10 (id_1 FLOAT, id_2 FLOAT, id_3 FLOAT);")

with open(filepath, 'r') as text:
     curs.copy_from(text, 'nmt_10', sep=" ")

curs.execute("SELECT AddGeometryColumn('nmt_10', 'geom', 2180, 'POINTZ', 3);")
curs.execute("CREATE INDEX nmt_10_index ON nmt_10 USING GIST (geom);")
curs.execute("UPDATE nmt_10 SET geom = ST_SetSRID(ST_MakePoint(id_1, id_2, id_3), 2180);")

conn.commit()
end = time.time()
print(end - start)

干杯