Проблема в том, что команда COPY выполняется слишком часто. на моей локальной машине медленнее, чем на удаленном сервере, хотя обе среды очень похожи. Мой локальный компьютер подключен к Интернету из белого списка, который также работает быстро.
Вот фрагмент моего кода:
Код: Выделить всё
import psycopg2
import glob
import os
from multiprocessing import Pool
from functools import partial
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()
if __name__ == "__main__":
file_path_list = sorted(glob.glob(os.path.join(file_path, "*.csv")))
with Pool(cores_to_use) 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
Результат трассировки:
- HIT 1:
< ul>
Шлюз: ~3,5 мс - Промежуточные переходы: от 6,5 мс до 27,9 мс
- Конечные переходы: от 7,0 мс до 10,1 мс
- Шлюз: ~1,6 мс
- Промежуточные переходы: от 5,5 мс до 40,7 мс
- Конечные переходы: 7,7 мс до 12,7 мс
Удаленный сервер
ОС: Linux Ubuntu
Результат трассировки:
- HIT 1:
Шлюз: от ~0,2 до 0,7 мс - Промежуточные переходы: все ответы либо недоступны, либо < 1 мс
- Шлюз: от ~0,6 до 0,7 мс
- Промежуточные переходы: все ответы либо недоступны или < 1 мс
Вопросы:
- Почему команда COPY может работать медленнее локально, несмотря на схожие характеристики и быстрое подключение к Интернету?
- Существуют ли такие проблемы какие-либо конкретные оптимизации или конфигурации, которые мне следует проверить на своем локальном компьютере, чтобы повысить производительность?
Может ли задержка сети или другие факторы влиять на локальную производительность, и если да, то как я могу решить эту проблему?< /li>
Подробнее здесь: https://stackoverflow.com/questions/789 ... er-with-id