Sto analizzando un log e inserendolo in MySQL o SQLite utilizzando SQLAlchemy e Python. In questo istante apro una connessione al DB e, mentre faccio il loop su ogni riga, lo inserisco dopo che è stato analizzato (questo è solo un grande tavolo in questo momento, non molto esperto con SQL). Quindi chiudo la connessione quando il ciclo è terminato. Il codice riassunto è:Inserimento più rapido di record in una tabella 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
Le mie due domande sono:
- Esiste un modo per accelerare gli inserti all'interno di questo quadro di base? Forse hanno una coda di inserti e alcuni thread di inserimento, una sorta di inserimenti di massa, ecc?
- Quando ho usato MySQL, per circa 1,2 milioni di record il tempo di inserimento era di 15 minuti. Con SQLite, il tempo di inserimento è stato di poco più di un'ora. Questa differenza di orario tra i motori db sembra giusta, o significa che sto facendo qualcosa di molto sbagliato?
Devo anche dire che quando mi sto chiedendo un modo per accelerarlo, voglio dire c'è qualcosa di fondamentale che dovrei fare e non sono che mi darà un grande guadagno (cioè, almeno più del 25% aumento della velocità di tempo).La velocità non è l'essenza qui, mi chiedo solo se sto facendo qualcosa in modo pedone poiché questo è tutto nuovo per me. –