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

标签 python database postgresql postgis

我需要在适当的时间内将 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. 使用 PostgreSQL COPY命令或copy_from正如@MauriceMeyer 指出的。如果由于某种原因您必须坚持插入,请确保您不会在每次插入后都进行提交;-)

干杯

关于python - 如何使用Python提高PostGIS中插入数据的效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66070645/

相关文章:

sql - 如何让 postgres 忽略带有重复键的插入但继续

Python提示工具包: How to always open/show autocompleter?

python - 将 Django 项目从 Windows 导入到 Linux 时出错

python - 使用 python-igraph 创建有向图

sql - R 中的动态 SQL 查询(WHERE)

Postgresql 在一个查询中对不同的组进行计数

python - 如何从子进程访问子进程 Popen pass_fds 参数?

mysql获取按多列排序的下一行

php - 架构设计问题

php - 如何在 Laravel 4.2 中自动生成特定类别任务的序列号?