使用python处理许多巨大的日志文件

rpb*_*ear 6 python logging

我正在使用一些python脚本来进行统计.一种日志内容就像这样我称之为日志:每个日志的格式为:

[2012-09-12 12:23:33] SOME_UNIQ_ID filesize
Run Code Online (Sandbox Code Playgroud)

我称之为另一个日志B日志的格式为:

[2012-09-12 12:24:00] SOME_UNIQ_ID
Run Code Online (Sandbox Code Playgroud)

我需要计算A日志中有多少记录也在B日志中,并获得具有相同记录ID的两个记录的时间间隔.我的实现是将所有时间和B日志的ID加载到地图中,然后迭代A日志检查它的ID是否存在于地图中.问题是它投入太多内存因为我在B log中有近1亿条记录.有什么建议可以提高性能和内存使用率吗?谢谢.

Jon*_*nts 3

您可以尝试反转查找,具体取决于“A”是否适合内存并顺序扫描“B”。

否则,将日志文件加载到具有两个包含 (timestamp、uniq_id、rest_of_line) 的表 (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)
Run Code Online (Sandbox Code Playgroud)

注意:

  • sqlite3.connect上的应该是一个文件名
  • a应该b是你的文件