python pandas to_sql с sqlalchemy: как ускорить экспорт в MS SQL?

У меня есть dataframe с примерно 155 000 строк и 12 столбцов. Если я экспортирую его в csv с помощью dataframe.to_csv, вывод будет 11 МБ-файлом (который создается мгновенно).

Если, однако, я экспортирую на Microsoft SQL Server с помощью метода to_sql, это занимает от 5 до 6 минут! Нет столбцов – это текст: только int, float, bool и даты. Я видел случаи, когда драйверы ODBC устанавливают nvarchar (max), и это замедляет передачу данных, но это не может быть здесь.

Любые предложения о том, как ускорить процесс экспорта? Взятие 6 минут для экспорта 11 МБ данных делает соединение ODBC практически непригодным для использования.

Благодаря!

Мой код:

import pandas as pd from sqlalchemy import create_engine, MetaData, Table, select ServerName = "myserver" Database = "mydatabase" TableName = "mytable" engine = create_engine('mssql+pyodbc://' + ServerName + '/' + Database) conn = engine.connect() metadata = MetaData(conn) my_data_frame.to_sql(TableName,engine) 

Метод DataFrame.to_sql генерирует инструкции вставки для вашего соединителя ODBC, который затем обрабатывается соединителем ODBC как обычные вставки.

Когда это происходит медленно, это не вина панд.

Сохранение вывода метода DataFrame.to_sql в файл, а затем воспроизведение этого файла через разъем ODBC займет столько же времени.

Правильный способ массового импорта данных в базу данных – генерировать файл csv, а затем использовать команду load, которая в MS-баре данных SQL называется BULK INSERT

Например:

 BULK INSERT mydatabase.myschema.mytable FROM 'mydatadump.csv'; 

Ссылка на синтаксис выглядит следующим образом:

 BULK INSERT [ database_name . [ schema_name ] . | schema_name . ] [ table_name | view_name ] FROM 'data_file' [ WITH ( [ [ , ] BATCHSIZE = batch_size ] [ [ , ] CHECK_CONSTRAINTS ] [ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ] [ [ , ] DATAFILETYPE = { 'char' | 'native'| 'widechar' | 'widenative' } ] [ [ , ] FIELDTERMINATOR = 'field_terminator' ] [ [ , ] FIRSTROW = first_row ] [ [ , ] FIRE_TRIGGERS ] [ [ , ] FORMATFILE = 'format_file_path' ] [ [ , ] KEEPIDENTITY ] [ [ , ] KEEPNULLS ] [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ] [ [ , ] LASTROW = last_row ] [ [ , ] MAXERRORS = max_errors ] [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ] [ [ , ] ROWS_PER_BATCH = rows_per_batch ] [ [ , ] ROWTERMINATOR = 'row_terminator' ] [ [ , ] TABLOCK ] [ [ , ] ERRORFILE = 'file_name' ] )]