「A」がメモリに収まるかどうかに応じてルックアップを逆にして、「B」を順番にスキャンしてみてください。
それ以外の場合は、(timestamp、uniq_id、rest_of_line)を含む2つのテーブル(log_a、log_b)を含むSQLite3データベースにログファイルをロードしてから、でSQL結合を実行しuniq_id
、その結果に対して必要な処理を実行します。これにより、メモリオーバーヘッドが低く抑えられ、SQLエンジンが結合を実行できるようになりますが、もちろん、ディスク上のログファイルを効果的に複製する必要があります(ただし、ほとんどのシステムでは通常、これは問題になりません)。
例
import sqlite3
from datetime import datetime
db = sqlite3.connect(':memory:')
db.execute('create table log_a (timestamp, uniq_id, filesize)')
a = ['[2012-09-12 12:23:33] SOME_UNIQ_ID filesize']
for line in a:
timestamp, uniq_id, filesize = line.rsplit(' ', 2)
db.execute('insert into log_a values(?, ?, ?)', (timestamp, uniq_id, filesize))
db.commit()
db.execute('create table log_b (timestamp, uniq_id)')
b = ['[2012-09-12 13:23:33] SOME_UNIQ_ID']
for line in b:
timestamp, uniq_id = line.rsplit(' ', 1)
db.execute('insert into log_b values(?, ?)', (timestamp, uniq_id))
db.commit()
TIME_FORMAT = '[%Y-%m-%d %H:%M:%S]'
for matches in db.execute('select * from log_a join log_b using (uniq_id)'):
log_a_ts = datetime.strptime(matches[0], TIME_FORMAT)
log_b_ts = datetime.strptime(matches[3], TIME_FORMAT)
print matches[1], 'has a difference of', abs(log_a_ts - log_b_ts)
# 'SOME_UNIQ_ID has a difference of 1:00:00'
# '1:00:00' == datetime.timedelta(0, 3600)
ご了承ください:
.connect
onsqlite3はファイル名である必要があります
a
そしてb
あなたのファイルでなければなりません