大批量文件處理的7條建議

最近由於項目需要,經常搗騰大批量的文檔,期間也走過不少彎路。發現大批量文件處理這玩意,整不好就耗時,大部分時間都花在焦急的等待過程中。隨着經驗的豐富,漸漸地也摸索出一些大批量文件處理的原則,分享在這裏:


原則1:選擇命令行,而不是GUI

例如一個文件夾,裏面存儲了百萬數量級的文件,且包含大量子文件夾。現在要統計文件夾下所有文件的數量,最常見的做法是右鍵點擊文件夾屬性,查看文件數量。然而這樣做往往直接導致Windows無響應。替代的做法是,選擇使用命令行工具來統計,比如dos下的dir命令,或者使用windows下的linux命令行工具:unxutils,它可以在windows下模擬大部分linux的命令,用find . -type f|wc -l就可以快速統計。這樣做不僅比GUI下快出幾倍,而且也不會出現“無響應”這樣的不友好界面。

原則2:壓縮存儲和傳輸

有時候磁盤上要存儲海量數據,將文件散步在磁盤塊上,不僅佔空間,也耗網絡傳輸時間。對於普通文本文件,一般壓縮格式的壓縮率都接近10%。如果要支持跨平臺,可選擇zip或者tar這樣的通用格式。而傳輸整塊大文件,也比傳輸海量的小文件,節省不少時間。即便是將壓縮和解壓縮時間考慮在內,這樣做也比直接傳輸散開的文件快不少。

原則3:緩存常用信息

如果你的程序經常需要遍歷一個文件夾下的所有文件進行處理,且文件集合穩定不變,系統花在遍歷的開銷非常大。這種情況下,你可以維護一個文件列表,系統只是在第一次生成列表的時候進行了一次遍歷,而此後系統不再需要再遍歷文件夾,直接讀取文件列表信息即可。而後者的代價遠遠小於前者。當然,也有很多情況下,常用信息經常是變化的,這就需要用到本文提到的第4條原則。

原則4:增量式修改信息

原則3中提到的文件夾如果經常存在變動,那是不是意味着每次還是不得不重新遍歷所有信息,以保證得到最新的文件夾信息?答案當然是否,除非在最壞情況下,幾乎所有的文件都被更新了一遍,否則你就可以只修改變化的那部分信息,來避免重新計算的開銷。比如文件夾每天增加當天的新數據,且刪除7天前的數據,那你就只需要更新這兩部分數據,而保留中間的6天數據。

原則5:並行處理

大家都有用下載工具下載文件的經歷。如果你的寬帶最高支持每秒200K數據的帶寬,那麼如果你現在進行的任務每秒只下載100K數據,你就應該再開幾個任務,並行下載,直到總下載量達到每秒200K的上限爲止。這樣才能最大限度地利用帶寬,做最多的事。當然一旦吞吐量到達瓶頸,再增加進程或線程不僅不增加處理速度,還有可能導致資源死鎖,枯竭。

原則6:減少I/O開銷

讀寫I/O非常耗時,如果不是很必要,就不用做這些無謂的操作。比如很多軟件都帶有不同級日誌的開關。如果只是普通用戶使用,就不需要保存很多詳細日誌信息,當發生故障需要診斷時,工程師可以打開日誌開關進行調試。測試工程師在平時測試中也可以重定向日誌,或者nohup。不僅節省I/O,也可以保存足夠的信息,進行錯誤跟蹤。

原則7:選擇批處理,而不是one-by-one的處理

好多軟件都包含批處理的功能,通過給定的執行列表,批量處理。而不需要用戶每次自己控制處理流程。比如wget軟件,支持給定的URL列表下載。如果用戶自己拆分URL列表,將其一一傳給wget,每次傳遞都造成wget的一次啓動和結束操作,造成無謂的開銷。優秀的軟件可以保證一次啓動/結果來執行批處理。所以在使用任何軟件前,先閱讀一下幫助手冊,看看有沒有批處理的功能,保證你事半功倍。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章