大文件讀寫效率比較

之前做到一個大日志文件(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.pswp.cn/news/282027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282027.shtml
英文地址,請注明出處:http://en.pswp.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;要滿足觸發條件…