Ho un dataframe con circa 155.000 righe e 12 colonne. Se lo esporto in csv con dataframe.to_csv, l'output è un file da 11 MB (che viene prodotto immediatamente).panda python to_sql con sqlalchemy: come velocizzare l'esportazione in MS SQL?
Se, tuttavia, esporto su un Microsoft SQL Server con il metodo to_sql, sono necessari tra 5 e 6 minuti! Nessuna colonna è testo: solo int, float, bool e date. Ho visto casi in cui i driver ODBC impostano nvarchar (max) e questo rallenta il trasferimento dei dati, ma non può essere il caso qui.
Qualche suggerimento su come velocizzare il processo di esportazione? Prendendo 6 minuti per esportare 11 MB di dati, la connessione ODBC diventa praticamente inutilizzabile.
Grazie!
Il mio codice è:
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)
l'unica cosa che mi viene in mente è quello di esportare solo la struttura, vale a dire i nomi delle colonne ei tipi di dati, ma nessuna riga, a S QL, quindi esportare il file in CSV e utilizzare qualcosa come la procedura guidata di importazione/esportazione per aggiungere il file CSV alla tabella SQL. In questo modo non devo definire nuovamente tutti i tipi di colonna; questo è importante perché gli strumenti di importazione tendono a leggere le prime x righe per indovinare i tipi di dati e, se le prime file sono tutte NULL, l'ipotesi sarà errata. Tuttavia, resta il fatto che il metodo to_sql è praticamente inutilizzabile a parte le tabelle minuscole. Lo hai già sperimentato con altri database? –
Ho provato lo stesso a casa, con un SQL Server Express in esecuzione sul mio stesso PC, e python ha impiegato 2 minuti per trasferire un dataframe di 1 milione di righe x 12 colonne di numeri casuali in SQL (dimensioni in CSV = 228 MB). Non super veloce ma accettabile. Ci sono voluti 6 minuti (per un file molto più piccolo) su un PC da lavoro connesso a un server SQL a poche miglia di distanza. Sai se esiste qualche parametro in panda, sqlalchemy o pyodbc per accelerare il trasferimento? Mi collego molto a quello stesso server SQL con molti altri strumenti, e non è mai così lento. Grazie! –
Chiunque? Ho anche verificato che il metodo pandas.read_sql_table è ragionevolmente veloce. È solo la scrittura che è lenta, anche quando si scrive un tavolo senza vincoli. Qualche idea? Non posso essere l'unico che abbia mai sperimentato questo, eppure non trovo alcuna documentazione su questo in linea ... :( –