繁体   English   中英

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

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

  3. 正如@MauriceMeyer 指出的那样,使用 PostgreSQL COPY命令或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)

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM