fast_executemany альтернатива для psycopg2 - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть сервер Redshift, который я запускаю через psycopg2 (обратите внимание, что ODBC не поддерживается на сервере компании, поэтому я не могу использовать pyodbc).

В настоящее время он занимает более 10 минут для строк 30–35 тыс.через pd.to_sql(), который записывает данные из кадра в базу данных Redshift.В качестве обходного пути я загружаю DF как csv, отправляю файл на S3, а затем использую copy для записи в БД.

Решение fast_executemany согласно Ускорение pandas.DataFrame.to_sql с fast_executemany pyODBC был бы идеальным - однако это не поддерживается в psycopg2.Я также нашел d6tstack согласно https://github.com/d6t/d6tstack/blob/master/examples-sql.ipynb, но pd_to_psql не работает для Redshift, только Postgresql (не может copy... from stdin)

Какие альтернативы я могу использовать для моего случая?

Это мой код:

import sqlalchemy as sa

DATABASE = ""
USER = ""
PASSWORD = ""
HOST = "...us-east-1.redshift.amazonaws.com"
PORT = "5439"
SCHEMA = "public" 

server = "redshift+psycopg2://%s:%s@%s:%s/%s" % (USER,PASSWORD,HOST,str(PORT),DATABASE)
engine = sa.create_engine(server)
conn = engine.raw_connection()

with conn.cursor() as cur:
    cur.execute('truncate table_name')

df.to_sql('table_name', engine, index=False, if_exists='append') 

1 Ответ

0 голосов
/ 15 декабря 2018

Если вы не можете использовать COPY из S3 и должны полагаться на DML, вы можете попробовать передать use_batch_mode=True в create_engine():

engine = create_engine('theurl', use_batch_mode=True)

На этой машине простая вставка 500 строк в кластер Redshift показала разумное улучшение при включенном пакетном режиме:

In [31]: df = pd.DataFrame({'batchno': range(500)})

In [32]: %time df.to_sql('batch', engine, index=False, if_exists='append')
CPU times: user 87.8 ms, sys: 57.6 ms, total: 145 ms
Wall time: 1min 6s

In [33]: %time df.to_sql('batch', bm_engine, index=False, if_exists='append')
CPU times: user 10.3 ms, sys: 4.66 ms, total: 15 ms
Wall time: 9.96 s

Обратите внимание, что версии Pandas 0.23.0 и 0.24.0 и выше не принесут пользыиз пакетного режима, так как они используют вставку нескольких значений вместо executemany, если базовая СУБД поддерживает это.Использование вставки нескольких значений должно обеспечить несколько аналогичные улучшения пропускной способности, поскольку выдается меньше запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...