Ускорьте вставку AWS PostgreSQL с помощью скрипта Python - PullRequest
0 голосов
/ 04 апреля 2020

В моем экземпляре AWS EC2 содержится 120 000 csv, каждый из которых содержит 120000 строк. Я не могу вставить каждый из них как есть в мою AWS RDS postgresql DB, это будет 120 000 ^ 2 = 14 400 000 000 записей. Каждый CSV составляет около 2 МБ.

Мой подход заключается в следующем:

  • Python скрипт, который преобразует 120 000 записей только в 1 запись (список словаря) для каждого CSV (теперь 5 МБ) после сжатия данных) с помощью pandas library
  • Сценарий python затем вставляет 1 запись каждого csv в базу данных AWS postgresql через pandas.to_sql (которая использует sqlalchemy
  • Я использую python многопроцессорный модуль, чтобы полностью использовать мой AWS EC2 для ускорения ввода данных
  • Я не создавал дополнительные индексы для ускорения ввода данных
  • Я использую AWS EC2 экземпляр с до 25 ГБ сетевого подключения

Мое наблюдение:

  • В начале мой код будет вставлять 50 csv в минуту, что это приличная скорость
  • Однако, сейчас, при вставке 50k csv, он вставляет только 1k csv за 5 часов, около 3.33 csv в минуту
  • Я пытался использовать psql \copy и понял, что требуется 30-50 SE c, чтобы вставить 1 CSV, это медленнее Мой сценарий, который преобразует данные и вставляет их в БД напрямую

Я не уверен, как я могу ускорить процесс.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Причина снижения производительности базы данных с 50 до 3,33 csv в минуту из-за класса экземпляра AWS RDS.

Я использую класс db.t2.micro, который я только что узнал, что он ограничен ЦП кредиты. После того, как я изменил класс экземпляра на t3, мой код вернулся к 50 csv в минуту.

Экземпляры Amazon RDS T3 DB работают в неограниченном режиме, что означает, что с вас будет взиматься плата, если ваш средний Загрузка ЦП в течение 24-часового периода превышает базовую линию экземпляра. Кредиты ЦП начисляются по 0,075 долл. США за час. Цены на кредиты ЦП одинаковы для всех размеров экземпляров T3 во всех регионах и не покрываются зарезервированными экземплярами.

Учитывая, что моему коду для выполнения требуется <1 se c, и только 1 запись вставлять каждый раз. <code>pandas.to_sql не должно быть узким местом. Хотя я верю, что использование SQLAlchemy будет работать лучше, чем pandas.to_sql. По той же причине psycopg2 работает лучше, чем SQLAlchemy.

Короче говоря, это проблема аппаратного, а не программного обеспечения. Исправьте это, обновившись до более мощного экземпляра. Спасибо.

0 голосов
/ 04 апреля 2020

Я всегда нахожу sql операций в pandas медленными, пытались ли вы напрямую взять словарь и вставить его через sqlalchemy?

Что-то вроде этого, где dict_list - ваш диктант:

sql = """INSERT INTO %s %s VALUES (%ss)"""
columns_string = '('+','.join(dict_list[0].keys())+')'
values_string = '%('+')s,%('.join(dict_list[0].keys())+')'
database_connection.execute(
    sql % (table_name, 
           columns_string, 
           values_string), 
           dict_list)```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...