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

标签 python logging

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

[2012-09-12 12:23:33] SOME_UNIQ_ID filesize

我称之为 B 日志的另一个日志具有以下格式:

[2012-09-12 12:24:00] SOME_UNIQ_ID

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

最佳答案

您可以尝试根据“A”是否适合内存并顺序扫描“B”来反转查找。

否则,将日志文件加载到具有两个表(log_a、log_b)的 SQLite3 数据库中,其中包含(timestamp、uniq_id、rest_of_line),然后在 uniq_id 上执行 SQL 连接,并进行任何处理要求从那个结果。这将保持低内存开销,使 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)

注意:

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

关于python - 使用 python 处理许多巨大的日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12435806/

相关文章:

python - 迭代数据帧的第 n 行

python - 如何使用Python3显示相对于字长的字数(串行,即以有序的方式)?

python - 如何在不在 iPython 笔记本中的离线模式下使用 plotly 进行绘图?

java - 登录 Spring 初始化

logging - LOG4J2:多个记录器,到多个附加器,在不同的日志记录级别

java - 解析日志文件以提取查询

python - 如何使用 Python 集并将字符串作为字典值添加到其中

python - 在 python 中重新排序列表,使偶数首先出现

java - 减少 log4j.xml 中 Tomcat Digester 记录器的冗长程度

java - 在大型 Java 应用程序中标准化日志记录的方法