• python高效解析日志入库


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

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

    经过测试,得到结论,在我们写代码的时候应该这样写

    f = open(path,'r')

    for line in f :

         .............

    这是系统提供的一种读文件的方法,一般比我们自己每次读若干byte要快(f.read(20000)),具体怎么做到的,现在还不清楚。总之,系统提供的,

    应该差不了,不然也太丢人。啊哈!

    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 开启一个后台线程对1、2、3三个线程的运行状况进行监控、记录与处理。

  • 相关阅读:
    建造者(Builder)模式
    模板方法模式(Tempalte Method Pattern)
    NIO Socket编程实例
    Java NIO概述
    转:Java中的Clone()方法详解
    调停者(Mediator)模式
    门面(Facade)模式
    struts2中方法拦截器(Interceptor)的中的excludeMethods与includeMethods的理解
    Struts2默认拦截器配置
    struts2的json-default和struts-default的区别
  • 原文地址:https://www.cnblogs.com/fengyv/p/3789531.html
Copyright © 2020-2023  润新知