應用場景
面試題:大文件,小內存怎么讀取
線上出問題,通過查找log定位問題,由於線上數據量龐大,這些log文件可能達到了五六g以上的大小。
對於這種巨大的log文件,常用的一些文本編輯器諸如EditPlus、Notepad++就不用說了,打開幾百m的文件都會很卡,上g的直接程序崩潰。雖然UltraEdit對於大文件的讀取會友好一些,但打開這種五六g的文件時也會陷入長時間的無響應狀態。
后來找到看log神器——glogg,打開五六g的大文件速度很快,但是有個問題,就是只能讀取文件,不能編輯文件。畢竟我不只是要查看log,有時候還要對這些有用的log信息進行編輯。最后還是決定先把大文件分割成數個小文件,再用UltraEdit來查看這些文件。
使用split命令分割大文件
- 在Linux下,切割和合並文件可以使用split和cat命令來實現。
- 在Windows下,安裝Git Bash也可以使用split和cat命令。
分割文件的命令是split,通過輸入split --help可以查詢幫助信息。假設現在有個6GB大小的文件test.log,這里簡單介紹下幾種分割的方式:
1. 按大小分割文件
split -b 1000000000 test.log
- -b參數表示按字節大小進行分割,在數字后邊要指定被分割的文件名。這里在輸入文件名時有個小技巧,可以直接把該文件拖動到cmd窗口中,會自動輸入該文件的具體目錄。這里的文件還可以使用通配符,比如split -b 1000000000 *。
- 這個命令表示按1000000000byte的大小進行分割,近似於1GB,大概是953MB的大小。對於這個6GB大小的文件test.log,會被分割成6個小文件。這些小文件的命名是有規律的:xaa、xab、xac、xad、xae、xaf。如果你分割了非常多的小文件,當文件名到了xyz之后,會變成xzaaa、xzaab、xzaac、xzaad……所以不用擔心小文件過多而導致文件重名什么的。
- 當然,上邊的這種寫法不夠人性化,我們可以使用其他的單位來指定分割的大小:k、m。k表示KB,m表示MB。
- split -b 100k test.log表示將test.log按照100KB的大小進行分割。
- split -b 100m test.log表示將test.log按照100MB的大小進行分割。
2. 按照所有行數加起來的最大字節數進行分割
split -C 100k test.log
- -C參數表示按照所有行數加起來的最大字節數進行分割,同樣可以使用k或者m作為單位,其實效果和上邊的-b差不多,只是在切割時將盡量維持每行的完整性。
3. 按照行數進行分割
split -l 1000 test.log
split -1000 test.log
- -l參數表示按照行數進行分割,即一個小文件中最多有多少行,-l number可以縮寫成-number,上邊的命令表示按照1000行一個小文件進行分割。
4. 注意點
這三種分割的方式不能混合使用,如下:
split -l 3000 -C 100k *
會報錯split: cannot split in more than one way。