Однако, независимо от подхода, я заметил, что скорость записи моего фрейма данных 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')
Python: 3.10.14
pyodbc: 5.1.0
Pandas: 2.2.3
sqlalchemy: 2.0.34
Подробнее здесь: https://stackoverflow.com/questions/790 ... arameter-o