我在本地运行 PostgreSQL
COPY
命令时遇到性能问题。具体来说,我的 .csv 文件位于本地计算机上,我使用 COPY 将它们推送到远程 PostgreSQL 服务器。我的远程后端应用程序服务器和本地 PC 都具有相同的规格(均具有 SSD、类似的 RAM 和 CPU 内核)。 PostgreSQL 数据库本身托管在不同的远程服务器上,只能通过特定的白名单互联网连接进行访问。
问题是,与远程服务器相比,
COPY
命令在我的本地计算机上运行速度明显慢,尽管两个环境非常相似。我的本地电脑通过VPN连接到互联网,速度也很快。当我在本地运行下面的代码时,它比在服务器上运行要慢得多。我还注意到另一个问题:当我在本地运行进程时,通过 PSQL、pgAdmin、DBeaver 等建立连接变得非常慢。很多时候,它无法连接到远程数据库。我不确定这个问题是由多重处理还是不同的宽带连接引起的。
这是我的代码片段:
from functools import partial
from multiprocessing import Pool, cpu_count
import psycopg2
def get_connection(env):
conn = psycopg2.connect(f"""postgresql://{env["USER"]}:{env["PASSWORD"]}@{env["HOST"]}:{env["PORT"]}/{env["NAME"]}""")
try:
yield conn
finally:
conn.close()
def copy_from(file_path: str, table_name: str, env, column_string: str):
with get_connection(env) as connection:
with connection.cursor() as cursor:
with open(file_path, "r") as f:
query = f"COPY {table_name} ({column_string}) FROM STDIN WITH (FORMAT CSV, HEADER FALSE, DELIMITER ',', NULL '')"
cursor.copy_expert(query, f)
connection.commit()
with Pool(cpu_count()) as p:
p.map(partial(copy_from, table_name=table_name, env=env, column_string=column_string), file_path_list)
操作系统:具有 Seqrite EndPoint Security 的 Linux Ubuntu 22.04 LTS
追踪路线结果:
操作系统:Linux Ubuntu
追踪路线结果:
问题:
COPY
命令在本地可能会变慢?任何见解或建议将不胜感激!
PostgreSQL 数据库本身托管在不同的远程服务器上,只能通过特定的白名单互联网连接进行访问。 ... 我本地电脑是通过VPN连接互联网的,速度也很快。
如果没有更多信息,我不能说,但性能差异可以简单地归因于必须通过 VPN 在互联网上发送大量数据。
您提供了延迟数字,但这与持续传输大量数据无关;我认为 CSV 很大,因为您不会注意到小 CSV 的问题。 与 COPY 相关的是持续传输速率。 这就是您应该测试的。
延迟是指获得响应所需的时间。传输速率是指数据传输的速度。用管道系统来比喻,延迟是指打开水龙头后需要多长时间才能取水,传输速率是指有多少水可以通过管道。您的传输速率仅与最慢的管道一样快,而这可能就是 VPN。
托管网络可以有两种数据传输速率:初始数据的快速速率,以及更多数据的较慢速率。小文件传输速度快,大文件启动速度快,然后速度变慢。由于大多数操作都会传输大量小文件(考虑带有小图像和文本文件的网页),这使得大多数事情的连接感觉很快。但是传输大文件(例如大 CSV)时,速度会变慢。这是为了节省带宽,同时保持连接流畅。
您应该关注的是服务器的持续传输速率。尝试使用
scp
将 CSV 文件传输到服务器,看看需要多长时间。