Как ускорить функцию Pandas .to_sql? - PullRequest
0 голосов
/ 21 декабря 2018
import cx_Oracle
import pandas as pd
from sqlalchemy import create_engine

# credentials
username = "user"
password = "password"
connectStr = "ip:port/service_name"

df = pd.read_csv("data.csv")

# connection
dsn = cx_Oracle.makedsn('my_ip',service_name='my_service_name')

engine = create_engine('oracle+cx_oracle://%s:%s@%s' % (username, 
password, dsn))

# upload dataframe to ORCLDB
df.to_sql(name="test",con=engine, if_exists='append', index=False)

Как я могу ускорить функцию .to_sql в Pandas?Мне нужно 20 минут, чтобы записать файл размером 120 КБ с 1000 строками в виде информационного кадра в БД.Все типы столбцов - VARCHAR2 (256).

Столбцы базы данных: https://imgur.com/a/9EVwL5d

1 Ответ

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

В данном случае происходит то, что для каждой вставляемой строки необходимо дождаться завершения транзакции, прежде чем начнется следующая.Работа здесь заключается в том, чтобы выполнить «массовую вставку» с использованием файла CSV, который загружается в память.Я знаю, как это сделать с помощью postgres (что я использую), но для оракула я не уверен.Вот код, который я использую для postgres, возможно, он будет чем-то полезен.

def bulk_insert_sql_replace(engine, df, table, if_exists='replace', sep='\t', encoding='utf8'):

    # Create Table
    df[:0].to_sql(table, engine, if_exists=if_exists, index=False)
    print(df)

    # Prepare data
    output = io.StringIO()
    df.to_csv(output, sep=sep, index=False, header=False, encoding=encoding)
    output.seek(0)

    # Insert data
    connection = engine.raw_connection()
    cursor = connection.cursor()
    cursor.copy_from(output, table, sep=sep, null='')
    connection.commit()
    cursor.close()

Вот ссылка на другой поток, в котором содержится масса полезной информации об этой проблеме: Массовая вставка ADataFrame для панд с использованием SQLAlchemy

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