Estoy analizando un registro e insertándolo en MySQL o SQLite usando SQLAlchemy y Python. Ahora mismo, abro una conexión con el DB, y mientras recorro cada línea, la inserto luego de que se haya analizado (esta es solo una gran tabla en este momento, no tiene mucha experiencia con SQL). Luego cierro la conexión cuando termina el ciclo. El código es resumida:Inserción más rápida de registros en una tabla con SQLAlchemy
log_table = schema.Table('log_table', metadata,
schema.Column('id', types.Integer, primary_key=True),
schema.Column('time', types.DateTime),
schema.Column('ip', types.String(length=15))
....
engine = create_engine(...)
metadata.bind = engine
connection = engine.connect()
....
for line in file_to_parse:
m = line_regex.match(line)
if m:
fields = m.groupdict()
pythonified = pythoninfy_log(fields) #Turn them into ints, datatimes, etc
if use_sql:
ins = log_table.insert(values=pythonified)
connection.execute(ins)
parsed += 1
Mis dos preguntas son:
- ¿Hay una manera de acelerar los insertos dentro de este marco básico? Tal vez tenga una cola de inserciones y algunos hilos de inserción, algún tipo de inserciones a granel, etc.
- Cuando utilicé MySQL, para aproximadamente ~ 1.2 millones de registros, el tiempo de inserción fue de 15 minutos. Con SQLite, el tiempo de inserción fue de poco más de una hora. ¿Esa diferencia de tiempo entre los motores DB parece correcta, o significa que estoy haciendo algo muy malo?
Debo también decir que cuando me pregunto sobre una forma de acelerarlo, quiero decir que hay algo básico que debería hacer y que no me dará una gran ganancia (es decir, al menos más del 25% aumento de velocidad de tiempo).La velocidad no es la esencia aquí, solo me pregunto si estoy haciendo algo de manera peatonal ya que esto es nuevo para mí. –