La mia azienda riceve ogni mese un set di file CSV completi di informazioni sul conto bancario che devo importare in un database. Alcuni di questi file possono essere abbastanza grandi. Ad esempio, uno è di circa 33 MB e circa 65.000 linee.Best practice per l'importazione di file CSV di grandi dimensioni
In questo momento ho un'app symfony/Doctrine (PHP) che legge questi file CSV e li importa in un database. Il mio database ha circa 35 diverse tabelle e sul processo di importazione, prendo queste righe, le divido nei loro oggetti costitutivi e li inserisco nel database. Funziona tutto magnificamente, tranne che è lento (ogni riga impiega circa un quarto di secondo) e utilizza molta memoria.
L'utilizzo della memoria è così grave che devo dividere i miei file CSV. Un file di 20.000 righe riesce a malapena a entrare. Nel momento in cui si avvicina alla fine, ho raggiunto il 95% di utilizzo della memoria. L'importazione di 65.000 file di linea non è semplicemente possibile.
Ho trovato symfony un framework eccezionale per la creazione di applicazioni e di solito non prenderei in considerazione l'idea di utilizzare altro, ma in questo caso sono disposto a buttare tutti i miei preconcetti fuori dalla finestra in nome della performance. Non sono impegnato in alcuna lingua specifica, DBMS o altro.
Stack Overflow non piace domande soggettive Quindi ho intenzione di provare a fare questo come non-soggettivo possibile: per quelli di voi hanno non solo un parere, ma esperienza l'importazione di file di grandi dimensioni CSV, quali strumenti/pratiche hai utilizzato in passato che hanno avuto successo?
Ad esempio, usi semplicemente l'ORM/OOP di Django e non hai avuto problemi? Oppure leggi l'intero file CSV in memoria e prepari alcune dichiarazioni gigantesche di INSERT
?
Ancora una volta, non voglio solo un'opinione, ma qualcosa che in realtà ha funzionato per te in passato.
Modifica: non sto solo importando un foglio di calcolo CSV a 85 colonne in una tabella di database a 85 colonne. Sto normalizzando i dati e inserendolo in dozzine di tabelle diverse. Per questo motivo, non posso semplicemente usare LOAD DATA INFILE
(sto usando MySQL) o qualsiasi altra funzionalità di DBMS che legge solo nei file CSV.
Inoltre, non è possibile utilizzare alcuna soluzione specifica Microsoft.
hai eseguito un'analisi delle prestazioni sul terminale DB in termini di modalità di creazione/commit delle transazioni? –
No. La mia intera importazione è racchiusa in un'unica grande transazione. Per quanto riguarda le singole affermazioni "INSERT", non ho fatto alcuna analisi delle prestazioni. Qualsiasi consiglio ci sarebbe apprezzato. (Tuttavia, questo da solo non risolve i miei problemi di utilizzo della memoria.) –