2010-10-18 14 views
7

Sto usando Python per salvare i dati riga per riga ... ma questo è estremamente lento!Come migrare un file CSV su Sqlite3 (o MySQL)? - Python

Il CSV contiene linee 70 milioni, e con il mio script posso solo memorizzare 1thousand un secondo.


Questo è ciò che il mio script sembra

reader = csv.reader(open('test_results.csv', 'r')) 
for row in reader: 
    TestResult(type=row[0], name=row[1], result=row[2]).save() 

mi sa che per la prova potrei prendere in considerazione MySQL o PostgreSQL.

Qualche idea o suggerimento? Questa è la prima volta che mi occupo di enormi volumi di dati. :)

+0

sqlite è più lento di mysql. mongoDB di solito è più veloce per l'inserimento, anche se ha altre limitazioni –

+0

Che cos'è 'TestResult'? Non hai mostrato alcuna chiamata effettiva a sqlite3, quindi è un po 'difficile commentare il codice così com'è. Qual è il tempo di lettura della linea di base se salti 'save()' e poi se sostituisci la costruzione di TestResult con 'pass'? –

+0

Testresult è una sottoclasse modello di Django ORM – RadiantHex

risposta

3

Non so se questo farà una grande differenza abbastanza, ma dal momento che' riguardo l'ORM di Django posso suggerire quanto segue:

  1. Assicurarsi che DEBUG è False nel tuo file di impostazioni Django, poiché altrimenti memorizzi ogni singola query in memoria.
  2. Metti la logica in una funzione principale e avvolgila nel decoratore django.db.transactions.commit_on_success. Ciò impedirà a ciascuna riga di richiedere la propria transazione, il che velocizzerà notevolmente il processo.
  3. Se si sa che tutte le righe nel file non esistono nel database, aggiungere force_insert = True alla chiamata al metodo save(). Questo dimezza il numero di chiamate a sqlite necessarie.

Questi suggerimenti faranno probabilmente una differenza ancora maggiore se ci si trova a utilizzare un DBMS client-server.

Problemi correlati