Запись фрейма данных Pandas на MS SQL Server происходит слишком медленно даже при использовании быстрых параметров парам ⇐ Python

Программы на Python
Anonymous
Запись фрейма данных Pandas на MS SQL Server происходит слишком медленно даже при использовании быстрых параметров парам

Сообщение Anonymous »

Я пытался вставить относительно небольшой кадр данных Pandas (около 200 тыс. записей) в Azure Synapse. Для этой цели я испробовал множество различных методов и подходов, основанных на API PYODBC и SQLAlchemy.
Однако, независимо от подхода, я заметил, что скорость записи моего фрейма данных SQL Server только ~ 10 записей в секунду. Это явно нежизнеспособно и неожиданно, но, прежде всего, причина этого остается для меня загадкой.
Я потратил много времени на поиск в Интернете ресурсов о том, как увеличить скорость записи, и нашел кучу людей, которые поднимали похожие проблемы и просили совета.
Мне известна опция .fast_executemany при создании SQLAlchemy.engine code>, который предположительно значительно ускоряет скорость записи, но, как видите, даже с ним результаты нежелательны.
Я также пробовал использовать выполнение на курсор, но результаты имеют точно такую ​​же производительность.
Другая попытка, которую я предпринял, была с Turbodbc, который также показал такую ​​же производительность.
В моем фрейме данных 11 столбцов, все из которых являются плавающими, кроме одного.
Из чего Я читал в документации, что опция fast_executemany должна пытаться разместить весь фрейм данных в памяти, однако во время операции я замечаю, что потребление памяти моего компьютера не Ничего не изменится.
Я здесь действительно в растерянности. Есть какие-нибудь идеи о причине этого и о том, как это исправить?
Заранее спасибо!
Вот мой код:

Код: Выделить всё

import pandas as pd
import sqlalchemy
import pyodbc
from sqlalchemy.engine import URL, create_engine

conn = pyodbc.connect('Driver=ODBC Driver 17 for SQL Server;'
'Server=SERVERNAME;'
'Database=DATABASENAME;'
'MARS_Connection=yes;'
'UID=USER;'
'PWD=PASS;')

connstring = "Driver={ODBC Driver 17 for SQL Server};Server=SERVERNAME;Database=DATABASENAME;UID=USER;PWD=PASS;"

conurl = URL.create("mssql+pyodbc", query={"odbc_connect":connstring,'autocommit':'True'})

dbEngine = sqlalchemy.create_engine(conurl, fast_executemany=True)

#for the sake of this example I only have 2 columns
d = {'userid': ['21005395', '20101499'], 'col1': [0.1, 0.25]}
df = pd.DataFrame(data=d)

#Even when only inserting 1K rows, the time to complete is ~130secs
df.head(1000).to_sql(
name = 'databaseTable'
, con = dbEngine
, schema = 'schema'
, method = None
, index = False
, chunksize = 500
, dtype = {
'userid' : sqlalchemy.types.NVARCHAR(10)
, if_exists='replace')
среда с использованием Anaconda 2.6.3:
Python: 3.10.14

pyodbc: 5.1.0

Pandas: 2.2.3

sqlalchemy: 2.0.34

Подробнее здесь: https://stackoverflow.com/questions/790 ... arameter-o

Вернуться в «Python»