新 天 地 平 台 招 商

  新 天 地 平 台 招 商-qQ同步【2668777777】信誉至上【待遇,一步到位】直接添加无需打开.python脚本解析日志文件入库一般有三个重要的步骤:读文件、解析文件、入库。在这三个方面下功夫,可确保我们获得最优的性能(这里不讨论并发)
  
  1 读文件:一次读一行,磁盘IO太多,效率低下;一次性读如全部文件内容,可能内存不够。采取一个折中的办法,每次读若干byte(具体大小视实际情况而定)。
  
  经过测试,得到结论,在我们写代码的时候应该这样写
  
  f = open(path,‘r‘)
  
  for line in f :
  
  .............
  
  新 天 地 平 台 招 商-qQ同步【2668777777】信誉至上【待遇,一步到位】直接添加无需打开.这是系统提供的一种读文件的方法,一般比我们自己每次读若干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应该没问题。
  
  ==============================================================================
  
  按照上面的写法,可以保证读文件、解析文件、入库每个环节都做到最优,但是在整体结构上还有优化的空间,详细如下:新 天 地 平 台 招 商-qQ同步【2668777777】信誉至上【待遇,一步到位】直接添加无需打开.
  
  1 启一个线程readThread只负责读文件,然后把读到的内容放到队列Queue1中;
  
  2 启一个线程manageThread只负责解析文件内容,然后把解析好的东西放到Queue2中;
  
  3 启动第三个线程writeDB负责将解析好的文件内容入库;
  
  4 开启一个后台线程对1、2、3三个线程的运行状况进行监控、记录与处理。

猜你喜欢

转载自www.cnblogs.com/huhz1979/p/12791350.html