我需要在适当的时间内将 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。
您可以采取一些措施来加快批量插入速度:
如果目标表为空或未在生产系统中使用,请考虑在插入数据之前删除索引。插入完成后,您可以重新创建它们。这将避免 PostgreSQL 在每次插入后重新索引您的表,在您的情况下这意味着 4600 万次。
如果目标表可以完全从 CSV 文件构建,请考虑创建
UNLOGGED TABLE
。未记录的表比“普通”表快得多,因为它们(顾名思义)不会记录在 WAL 文件(预写日志)中。如果数据库崩溃或非正常关闭,未记录的表可能会丢失!使用 PostgreSQL
COPY
命令或copy_from
正如@MauriceMeyer 指出的。如果由于某种原因您必须坚持插入,请确保您不会在每次插入后都进行提交;-)
干杯
关于python - 如何使用Python提高PostGIS中插入数据的效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66070645/