python高效解析日志入库

 

python脚本解析日志文件入库通常有三个重要的步骤:读文件、解析文件、入库。在这三个方面下功夫,可确保咱们得到最优的性能(这里不讨论并发)
python

1 读文件:一次读一行,磁盘IO太多,效率低下;一次性读如所有文件内容,可能内存不够。采起一个折中的办法,每次读若干byte(具体大小视实际状况而定)。正则表达式

通过测试,获得结论,在咱们写代码的时候应该这样写并发

f = open(path,'r')性能

for line in f :测试

     .............优化

这是系统提供的一种读文件的方法,通常比咱们本身每次读若干byte要快(f.read(20000)),具体怎么作到的,如今还不清楚。总之,系统提供的,spa

应该差不了,否则也太丢人。啊哈!线程

2 解析日志,若是用到正则表达式,应该先编译而后再查找,这样能够提升速度。例如 :日志

  regex0 = re.compile("(^|;)mobile=(\d+)")队列

  mobile_number=regex0.search(self.resp_log).group(2)

  固然,这是一个大方面,精细的方面咱们还要在正则的写法上下功夫。关于Python的正则的高效写法,后续会专门用一边文章来写。

3 入库:网上有好多建议使用executemany()这个写法,insert into tablename(xx,xx) values(yy,yy),(yy,yy)....的形式却会快不少,

咱们应 该直接把咱们的SQL拼接成这种形式,效率远远高于executemany(),具体一次性要插入多少行,本身测一下哦。每秒1W应该没问题。

==============================================================================

按照上面的写法,能够保证读文件、解析文件、入库每一个环节都作到最优,可是在总体结构上还有优化的空间,详细以下:

1  启一个线程readThread只负责读文件,而后把读到的内容放到队列Queue1中;

2  启一个线程manageThread只负责解析文件内容,而后把解析好的东西放到Queue2中;

3  启动第三个线程writeDB负责将解析好的文件内容入库;

4 开启一个后台线程对一、二、3三个线程的运行情况进行监控、记录与处理。

相关文章
相关标签/搜索