2010-10-18 15 views
7

Estoy usando Python para guardar los datos fila por fila ... ¡pero esto es extremadamente lento!¿Cómo migrar un archivo CSV a Sqlite3 (o MySQL)? - Python

El CSV contiene 70 millones de líneas , y con mi guión que sólo puede almacenar un segundo 1thousand.


Esto es lo que se ve mi guión como

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

tengo por cierto que para las pruebas de que podría tener que considerar MySQL o PostgreSQL.

¿Alguna idea o consejo? Esta es la primera vez que trato con tales volúmenes masivos de datos. :)

+0

sqlite es más lento que mysql. mongoDB generalmente es más rápido para la inserción, aunque tiene otras limitaciones –

+0

¿Qué es 'TestResult'? No ha mostrado ninguna llamada real a sqlite3, por lo que es un poco difícil comentar el código tal como está. ¿Cuál es el tiempo de lectura de referencia si omite 'save()' y luego si reemplaza la construcción TestResult con 'pass'? –

+0

Testresult es una subclase del Modelo de ORM de Django – RadiantHex

Respuesta

3

No sé si esto va a hacer una diferencia lo suficientemente grande, pero ya que' Re tratar con el ORM de Django Puedo sugerir lo siguiente:

  1. Asegúrese de que DEBUG es False en el archivo de configuración de Django, ya que de lo contrario está almacenando cada consulta en la memoria.
  2. Ponga su lógica en una función principal, y envuélvala en el decorador django.db.transactions.commit_on_success. Eso evitará que cada fila necesite su propia transacción, lo que acelerará sustancialmente el proceso.
  3. Si sabe que todas las filas del archivo no existen en la base de datos, agregue force_insert = True a su llamada al método save(). Esto reducirá a la mitad el número de llamadas a sqlite necesarias.

Estas sugerencias probablemente harán una diferencia aún mayor si se encuentra utilizando un DBMS cliente-servidor.

Cuestiones relacionadas