大文件读写效率比较

之前做到一个大日志文件(size > 1G)解析的项目,在此记录下对于大文本解析方式的效率比较。不同方式的性能差别很大,那个项目的日志解析时间能从原来的超过36小时优化到只需要2分钟,awk功不可没。

bash 比较

bash脚本中对于文本的读取主要有以下四种,尽管 AWK 具有完全属于其本身的语法,但在此我也把它归在一起:

#方法一
func1(){rm -f $2echo "$(date) start to read"start_time=$(date +%s)cat $1|while read Linedoecho $Line >> $2doneend_time=$(date +%s)echo "$(date) end to read"echo "cost: "$((end_time-start_time))"sec"
}#方法二
func2(){rm -f $2echo "$(date) start to read"start_time=$(date +%s)while read Linedoecho $Line >> $2done <$1end_time=$(date +%s)echo "$(date) end to read"echo "cost: "$((end_time-start_time))"sec"
}#方法三
func3(){rm -f $2echo "$(date) start to read"start_time=$(date +%s)for Line in `cat $1`doecho $Line >> $2doneend_time=$(date +%s)echo "$(date) end to read"echo "cost: "$((end_time-start_time))"sec"
}#func4
func4(){rm -f $2echo "$(date) start to read"start_time=$(date +%s)awk '{print $0}' $1 > $2echo "$(date) end to read"echo "cost: "$((end_time-start_time))"sec"
}source=$1
dest=$2#比较结果:
echo "####cat read: "
func1 $source $dest
echo "####redirect read: "
func2 $source $dest
echo "####for read: "
func3 $source $dest
echo "####awk read: "
func4 $source $dest

结果:

cat read:

Thu Jan 15 07:57:50 GMT 2015 start to read

Thu Jan 15 07:58:33 GMT 2015 end to read

cost: 43sec

redirect read:

Thu Jan 15 07:58:33 GMT 2015 start to read

Thu Jan 15 07:59:01 GMT 2015 end to read

cost: 28sec

for read:

Thu Jan 15 07:59:01 GMT 2015 start to read

Thu Jan 15 08:00:00 GMT 2015 end to read

cost: 59sec

awk read:

Thu Jan 15 08:00:00 GMT 2015 start to read

Thu Jan 15 08:00:00 GMT 2015 end to read

cost: 0sec

从以上结果可以看出,awk的效率远超其他方法

python 比较

python 有三种读取文件的方法:

read() 会将所有内容读入到一个字符串中
readline() 每次读取一行
readlines() 将所有内容按行读取,返回一个列表,列表中每个元素是一个字符串,一个字符串是一行内容
所以从效率上讲, read() 和readlines()会比readline()高,但是同时对内存的要求也比较高,需要能一次性将文件内容放入内存中。但是如果这个文件很大的话,就会影响到程序运行的速度,甚至会导致程序挂掉,此时分行读取或是设置buff_size会是个更好的选择

#!/usr/bin/env python
import time
import os
def func1(source,dest):os.remove(dest)with open(source, 'r') as fr:content=fr.read()with open(dest,'w') as fw:fw.write(content)
def  func2(source,dest):os.remove(dest)fw=open(dest,'w')for line in open(source,'r'):fw.write(line)fw.close
if __name__ == '__main__':from timeit import Timert1=Timer("func1('log','log1')","from __main__ import func1")t2=Timer("func2('log','log1')","from __main__ import func2")print "read once: "+str(t1.timeit(1))print "read line: "+str(t2.timeit(1))

40M文件5次处理时间:

read once: 0.308089971542

read line: 1.17492413521

1G文件首次处理时间:

read once: 8.17146706581

read line: 4.13687205315

1G文件5次处理时间:

read once: 7.32681894302

read line: 30.3610920906

有意思的是,虽然一次性读入内存效率比line by line读取的效率差,但是假如重复处理同一个文件,一次性读取的总体效率反而高,所以python应该做了类似于缓存的机制。所以当我们用python处理大文本文件的时候需要综合考虑服务器内存,文件处理次数来决定使用哪种方式。

转载于:https://www.cnblogs.com/muahao/p/6845394.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python装饰器执行顺序

2019独角兽企业重金招聘Python工程师标准>>> 1、单个装饰器执行 上来先看代码&#xff1a; import timedef deco(func):functools.wraps(func)def _wrapper():startTime time.time()print "start"func()print "end"endTime time.time()msecs …

tomcat限制用域名访问 禁止 ip访问

有时候会遇到服务器网站。只可以通过域名访问。而不允许ip访问。防止域名恶意解析&#xff0c;tomcat可以实现这个简单功能。1&#xff0c;禁止ip访问项目 2&#xff0c;只允许绑定域名访问环境&#xff1a;tomcat7 外网地址&#xff1a;114.113.100.166 域名&#xff1a;bi…

Object关于属性property的静态方法

Object.defineProperty Object.defineProperty(obj, prop, { value: undefined, enumerable: true, writable:true, get: function() {return value}, set: function(newValue) {value newValue;} }) 当时配置了set和get时&#xff0c;则不能配置value。 Object.getOwnPropert…

99. Recover Binary Search Tree

一、题目 1、审题 2、分析 给出一个二叉查找树&#xff0c;其中有两个元素的位置弄错了&#xff0c;写算法将其恢复。 二、解答 1、思路&#xff1a; 方法一、 通过中序遍历可以确定一棵二叉查找树由小到大的顺序。 所以在此错位的查找树中查找到的节点中有 1 个比后续节点值大…

myeclipse+git pull项目报错

2019独角兽企业重金招聘Python工程师标准>>> 1.在本地工程目录(.git)找到config文件&#xff1b; 2.修改config文件内容为&#xff1a; [core] repositoryformatversion 0 filemode false logallrefupdates true [branch "master"] remote origin m…

luoguP4755 Beautiful Pair

https://www.luogu.org/problemnew/show/P4755 考虑分治&#xff0c;在 [l, r] 区间中用线段树找到最大的一个点&#xff0c;处理经过它的可行数对的个数&#xff0c;统计个数可以离线树状数组处理 因为最多被分成 2n 个区间&#xff08;像线段树一样&#xff09;&#xff0c;对…

如何关掉macbook的开机声音

1、系统偏好设置->声音 2、关掉“启动时播放声音” 这样设置之后&#xff0c;macbook再开机就没有“咚”的那个声音了

oatdata结构详解

段名称 文件内偏移段大小ELF头部0x000000000x00001000oatdata0x000010000x027b8000oatexec0x027b90000x01ed69ecELF尾部0x046900000x00001000OatHeader&#xff1a; 0x00001000 | 6F 61 74 0A 30 33 39 00 77 40 00 B1 03 00 00 00 | 0x00001010 | 01 00 00 00 19 00 00 00 00…

【跃迁之路】【599天】程序员高效学习方法论探索系列(实验阶段356-2018.09.27)...

(跃迁之路)专栏 实验说明 从2017.10.6起&#xff0c;开启这个系列&#xff0c;目标只有一个&#xff1a;探索新的学习方法&#xff0c;实现跃迁式成长实验期2年&#xff08;2017.10.06 - 2019.10.06&#xff09;我将以自己为实验对象。我将开源我的学习方法&#xff0c;方法不断…

开源 java CMS - FreeCMS2.6 Web页面信息采集

2019独角兽企业重金招聘Python工程师标准>>> java开源论坛系统http://javabbs.javaz.cn 项目地址&#xff1a;http://www.freeteam.cn/ Web页面信息采集 从FreeCMS 2.1开始支持 通过简单配置即可抓取目标网页信息&#xff0c;支持增量式采集、关键字替换、定时采集&…

PropertySource和ConfigurationProperties

https://blog.csdn.net/u013725455/article/details/79352459转载于:https://www.cnblogs.com/qunincey/p/9721364.html

ORACLE关于段的HEADER_BLOCK的一点浅析

在学习段&#xff08;segment&#xff09;、区间&#xff08;extent&#xff09;时&#xff0c;对段的HEADER_BLOCK有一些疑问&#xff0c;本文记录一下探究的实验过程以及相关总结&#xff0c;&#xff0c;如有不对的地方&#xff0c;敬请指出。以SCOTT.EMP表为例&#xff08;…

【源码探索】.NET中的List,为什么即有Count属性又有Count()方法

“优秀的程序员的标准之一是&#xff1a;编写更易于扩展的代码”图片&#xff1a;奥森公园的向日葵 拍摄于2022年7月23日01—问题缘起上一篇中&#xff0c;我们知道List<T>的是基于数组实现的可变长度的列表。很多小伙伴发现&#xff0c;List<T>即有Count属性又有C…

使用ASP.NET广告控件的XML语言创建广告链接--ASP.NET

1、AdRotator广告控件的所有属性都是可选的&#xff0c;XML文件中可以包含如下表所示的属性&#xff08;XML文件的广告属性&#xff09;。 属性 说明 ImageUrl 要显示的图像的URL NavigateUrl 单击AdRotator控件时要转到的网页URL AlternateText 图像不可用时现实的问…

vim编辑和命令模式、实践

2019独角兽企业重金招聘Python工程师标准>>> 9月29日任务 5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 Vim编辑模式 进入编辑模式 操作 说明 i 在光标所在字符前插入内容 I 在光标所在行行首插入内容 a 在光标所在字符后插入内容 A 在光标所在行行尾插入…

英语自动提取高频词_斑马英语提分营免费体验课

斑马英语电脑版是一款专业可靠的英语学习软件&#xff0c;斑马英语官方版可以帮助孩子学习纯正的英语口语发音&#xff0c;以讲故事的形式让孩子学习单词及口语练习&#xff0c;斑马英语电脑版针对儿童语言特征设计的智能口语测评系统&#xff0c;能够自动识别发音和评分&#…

【C# Personal Handbook】开篇

博客已提更一年多了&#xff0c;这段时间里&#xff0c;发生了很多事情&#xff0c;也让我对C#更加依恋&#xff0c;所以我决定重新更新博客&#xff0c;以自己的实践经验梳理C#的技术脉络&#xff0c;也欢迎大家手下留情&#xff0c;耐心指点&#xff0c;让我们共同进步吧&…

canvas特效代码详解(2)

canvas是一个就基于像素的画图h5元素。 利用canvas做一个如下描述所示的动态图形&#xff1a;当鼠标点下去时开始绘图&#xff0c;在鼠标结束时完成一个矩形&#xff0c;当再一次点击时重复第一次的绘图步骤。 1 <!DOCTYPE html>2 <html>3 <head>4 …

阿里云三维可视化使用初体验

title: 阿里云三维可视化使用初体验tags: 物联网开发BIMcategories:物联网本文主要的目标是使用阿里云的云产品 - 物联网套件三维可视化 开始 准备工作 进入下载页面下载页面&#xff0c;点击“模型编辑器下载”安装模型编辑器下载安装完毕&#xff0c;启动模型编辑器下载&…

同时绑定onpropertychange 和 oninput 事件,实时检测 input、textarea输入改变事件,支持低版本IE,支持复制粘贴...

实时检测 input、textarea输入改变事件&#xff0c;支持低版本IE&#xff0c;支持复制粘贴 检测input、textarea输入改变事件有以下几种&#xff1a; 1、onkeyup/onkeydown 捕获用户键盘输入事件。缺陷&#xff1a;复制粘贴时无法检测2、onchenge缺陷&#xff1a;要满足触发条件…