python 将日志文件读取到dataframe,效率太低

muriyi 2016-10-13 09:39:20
一、问题描述
现有日志文件,大小约为100M,每行日志的内容形式为:
05/30-19:09:10.917356 [**] [1:527:8] BAD-TRAFFIC same SRC/DST [**] [Classification: Potentially Bad Traffic] [Priority: 2] {UDP} 0.0.0.0:68 -> 255.255.255.255:67。,
为更好的对日志文件内容进行分析,初步设想是将日志记录读取到python Pandas.Dataframe中进行统计分析。
二、初步思路
由于文件未采用CSV的方式进行日志记录,只能通过打开文件按行读取,然后对每行通过正则提取相应的内容,并将结果添加到Dataframe中。
三、存在的问题:
1、整个过程正则加append操作效率过低,有没有什么优化的方式?
2、是否还有其他方式对这种类型的日志文件进行整理读取?
四、附代码如下:

from pandas import DataFrame
import nltk
import re
import pandas as pd
import time

df = DataFrame(columns=('Date','Info','Classification','Priority','Protocol','Source','Dest'))
with open('alert.fast') as alert_file:
alert_dataset = alert_file.readlines()
for line_data in alert_dataset:
info=re.findall("\[\*\*\] (.*) \[\*\*\]",line_data)
classification = re.findall("\[Classification: (.*)\] \[",line_data)
source = re.findall("} (.*) \->",line_data)
dest = re.findall("\-> (.*)",line_data)
protocol = re.findall("{(.*)}",line_data)
priority = re.findall("\[Priority: (.*)\]",line_data)
date_value = re.findall("(.*) \[\*\*\]",line_data)

df=df.append(DataFrame([dict(Date=date_value,Info=info,Classification=classification,
Priority=priority,Protocol=protocol,Source=source,Dest=dest)]),
ignore_index=True)

...全文
681 1 打赏 收藏 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2016-10-14
  • 打赏
  • 举报
回复
你的程序里有很多冗余的操作。 1. findall需要扫描整个字符串,即使你已经在字符串开头找到了匹配。可以用search替换findall。 2. 每一项信息都要从头开始找,所以字符串的开始部分被查找了很多次。如果所有项的顺序固定的话,建议把所有的项用一个正则一次找出来。 3. 每次循环,re都需要重新编译一次用到的正则。在循环体外,把用到的正则先编译好。 4. 对每一行,你构造了一个DataFrame,再把它append到df。更好的办法是把每一行作为一个tuple,存到一个list中,最后用这个list构造最后的DataFrame。

37,737

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧