Я столкнулся с проблемой производительности команды PostgreSQL COPY при ее локальном запуске. В частности, мои файлы .csv находятся на моем локальном компьютере, и я отправляю их на удаленный сервер PostgreSQL с помощью COPY. И мой удаленный внутренний сервер приложений, и мой локальный компьютер имеют одинаковые характеристики (оба с твердотельными накопителями, одинаковой оперативной памятью и ядрами ЦП). Сама база данных PostgreSQL размещена на другом удаленном сервере, и доступ к ней возможен только через определенное подключение к Интернету, занесенное в белый список.
Конфигурация
Ядер: 8
ОЗУ: 16 ГБ
Диск Место: 100 ГБ (50 % бесплатно)
ОС: Linux Ubuntu
Django : 5.1
Python: 3.11
Проблема в том, что команда 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)
Локальный компьютер
ОС: Linux Ubuntu 22.04 LTS с Seqrite EndPoint Security Результат трассировки:
Шлюз: ~3,5 мс
Промежуточные переходы: 6,5 от мс до 40,7 мс
Конечные переходы: от 7,7 мс до 12,7 мс
Удаленный сервер >
ОС: Linux Ubuntu Результат трассировки:
Шлюз: от ~0,2 до 0,7 мс
Промежуточные переходы: все ответы либо недоступны, либо < 1 мс
Вопросы:
Почему команда COPY может работать медленнее локально, несмотря на схожие характеристики и быстрое подключение к Интернету?
Есть ли какие-либо конкретные оптимизации или конфигурации, которые мне следует проверить на своем локальном компьютере для повышения производительности?
Может ли задержка сети или другие факторы влияет на местную производительность, и если да, то как я могу решить эту проблему?
Будем очень признательны за любые идеи и предложения!
Я столкнулся с проблемой производительности команды PostgreSQL COPY при ее локальном запуске. В частности, мои файлы .csv находятся на моем локальном компьютере, и я отправляю их на удаленный сервер PostgreSQL с помощью COPY. И мой удаленный внутренний сервер приложений, и мой локальный компьютер имеют одинаковые характеристики (оба с твердотельными накопителями, одинаковой оперативной памятью и ядрами ЦП). Сама база данных PostgreSQL размещена на другом удаленном сервере, и доступ к ней возможен только через определенное подключение к Интернету, занесенное в белый список. [h4]Конфигурация[/h4] [list] [*][b]Ядер:[/b] 8 [*][b]ОЗУ:[/b] 16 ГБ [*][b]Диск Место:[/b] 100 ГБ (50 % бесплатно) [*][b]ОС:[/b] Linux Ubuntu [*][b]Django :[/b] 5.1 [*][b]Python:[/b] 3.11 [/list] Проблема в том, что команда COPY выполняется на моем локальном компьютере значительно медленнее, чем на удаленном сервере, хотя обе среды очень похожи. Мой локальный компьютер подключен к Интернету через VPN, который также работает быстро. Когда я запускаю приведенный ниже код локально, он работает намного медленнее, чем когда я запускаю его на сервере. Я также заметил еще одну проблему: установление соединения через PSQL, pgAdmin, DBeaver и т. д. становится чрезвычайно медленным, когда я запускаю процесс локально. Во многих случаях он не подключается к удаленной базе данных. Я не уверен, вызвана ли эта проблема многопроцессорностью или другим широкополосным соединением. Вот фрагмент моего кода: [code]from functools import partial from multiprocessing import Pool, cpu_count import psycopg2
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) [/code] [b]Локальный компьютер[/b] ОС: Linux Ubuntu 22.04 LTS с Seqrite EndPoint Security [b]Результат трассировки:[/b] [list] [*]Шлюз: ~3,5 мс [*]Промежуточные переходы: 6,5 от мс до 40,7 мс [*]Конечные переходы: от 7,7 мс до 12,7 мс [/list] [b]Удаленный сервер[/b] > ОС: Linux Ubuntu [b]Результат трассировки:[/b] [list] [*]Шлюз: от ~0,2 до 0,7 мс [*]Промежуточные переходы: все ответы либо недоступны, либо < 1 мс [/list][b]Вопросы:[/b] [list] [*]Почему команда COPY может работать медленнее локально, несмотря на схожие характеристики и быстрое подключение к Интернету? [*]Есть ли какие-либо конкретные оптимизации или конфигурации, которые мне следует проверить на своем локальном компьютере для повышения производительности? [*]Может ли задержка сети или другие факторы влияет на местную производительность, и если да, то как я могу решить эту проблему? [/list] Будем очень признательны за любые идеи и предложения!
Я столкнулся с проблемой производительности команды PostgreSQL COPY при ее локальном запуске. Мой удаленный внутренний сервер приложений и мой локальный компьютер имеют одинаковые характеристики (оба с твердотельными накопителями, одинаковой...
Я столкнулся с проблемой производительности команды PostgreSQL COPY при ее локальном запуске. Мой удаленный внутренний сервер приложений и мой локальный компьютер имеют одинаковые характеристики (оба с твердотельными накопителями, одинаковой...
Я столкнулся с проблемой производительности команды PostgreSQL COPY при ее локальном запуске. Мой удаленный внутренний сервер приложений и мой локальный компьютер имеют одинаковые характеристики (оба с твердотельными накопителями, одинаковой...
Как вы можете видеть в прилагаемом скриншоте, описан следующий код, чтобы вызвать конструктор копирования, когда OBJ1 копируется с возвращающим значением из вызова MyClass :: createObject . Однако выход показывает, что конструктор по умолчанию...
Следующий код показывает, что конструктор по умолчанию (а не конструктор копии) вызывается, когда obj1 инициализируется копированием с возвращающим значением из вызова в MyClass :: createObject . Что я заметил, так это то, что в таком случае адрес...