最近因爲項目須要,常常搗騰大批量的文檔,期間也走過很多彎路。發現大批量文件處理這玩意,整很差就耗時,大部分時間都花在焦急的等待過程當中。隨着經驗的豐富,漸漸地也摸索出一些大批量文件處理的原則,分享在這裏:
原則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的一次啓動和結束操做,形成無謂的開銷。優秀的軟件能夠保證一次啓動/結果來執行批處理。因此在使用任何軟件前,先閱讀一下幫助手冊,看看有沒有批處理的功能,保證你事半功倍。