A granel inserte datos enormes en SQLite utilizando Python

Leí esto: Importar un archivo CSV en una tabla de base de datos sqlite3 usando Python

y parece que todo el mundo sugiere el uso de la lectura línea por línea en lugar de usar la importación masiva desde SQLite. Sin embargo, eso hará que la inserción sea realmente lenta si tiene millones de filas de datos. ¿Hay alguna otra manera de eludir esto?

Actualización: Intenté el siguiente código para insertar línea por línea, pero la velocidad no es tan buena como esperaba. ¿Hay alguna forma de mejorarlo?

for logFileName in allLogFilesName: logFile = codecs.open(logFileName, 'rb', encoding='utf-8') for logLine in logFile: logLineAsList = logLine.split('\t') output.execute('''INSERT INTO log VALUES(?, ?, ?, ?)''', logLineAsList) logFile.close() connection.commit() connection.close() 

Divida sus datos en partes sobre la marcha usando expresiones generadoras, haga inserciones dentro de la transacción. Aquí hay una cita de las preguntas frecuentes de optimización de sqlite :

A menos que ya esté en una transacción, cada sentencia de SQL tiene una nueva transacción iniciada para ella. Esto es muy costoso, ya que requiere reabrir, escribir y cerrar el archivo de diario para cada statement. Esto se puede evitar envolviendo secuencias de sentencias de SQL con BEGIN TRANSACTION; y TRANSACCIÓN FINAL; declaraciones Esta aceleración también se obtiene para las declaraciones que no alteran la base de datos.

Así es como puede verse tu código.

Además, sqlite tiene la capacidad de importar archivos CSV .

Dado que este es el resultado principal en una búsqueda de Google, pensé que sería bueno actualizar esta pregunta.

Desde los documentos de python sqlite puede usar

 import sqlite3 persons = [ ("Hugo", "Boss"), ("Calvin", "Klein") ] con = sqlite3.connect(":memory:") # Create the table con.execute("create table person(firstname, lastname)") # Fill the table con.executemany("insert into person(firstname, lastname) values (?,?)", persons) 

He utilizado este método para realizar más de 50k inserciones de fila a la vez y es increíblemente rápido.

Sqlite puede hacer decenas de miles de inserciones por segundo , solo asegúrese de hacerlas todas en una sola transacción rodeando las inserciones con BEGIN y COMMIT. (executemany () hace esto automáticamente.)

Como siempre, no optimices antes de que sepas que la velocidad será un problema. Primero pruebe la solución más fácil, y solo optimice si la velocidad es inaceptable.