我正在使用一些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亿条记录.有什么建议可以提高性能和内存使用率吗?谢谢.
您可以尝试反转查找,具体取决于“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)
注意:
.connect上的应该是一个文件名a应该b是你的文件| 归档时间: |
|
| 查看次数: |
790 次 |
| 最近记录: |