擴充你的工具箱 大行檔案的處理

2021-09-07 14:39:36 字數 2422 閱讀 3728

前言

前幾天,從 dba 手裡接到乙個 redis rdb 檔案,裡面是 15g 約 660萬 的 redis 鍵值對資料,想通過這些資料提取出當前 redis 的 key 和這些 key 的型別。其檔案的每行結構類似於:

key: iamatestkey || type: string || expiretime:-1 || value:iamthetestvalue

下文就是此問題的跳坑和脫坑過程:

對 linux 命令稍熟悉的同學可能就會說了:這些資料格式這麼統一,資料字段間也有明顯的分隔符,不正是awk工具大顯身手的時刻嗎?

是的,awk是 linux 下乙個強大而又略複雜的命令,使用它的簡單語句也可以高效地處理大量文字,但是今天的主角不是它,我也不想複製貼上網上到處都是的教程,就不再多介紹了。

原以為使用awk -f ' ' '' rdb.log >>keys.txt將結果重定向到keys.txt,也就一行命令的事,可是執行後,發現執行了兩個小時還沒有結束的意思。

是檔案太大,awk 卡住了麼?

檔案太大處理不方便,這時,就要用到linux的另乙個工具了:split將檔案以行數/大小平均分割;split [-b bytes][-l line] input_file output_prefix

由於每一行的大小是不同的,按照大小來分割的話可能會導致某一行被拆散,於是以每個檔案 100 萬行,分割出7個檔案,再對這些檔案分別使用awk來處理,split -l 1000000 rdb.log rdb_split_

對分割後的檔案使用awk,結果奇怪的是還是會在某個檔案上執行很長時間沒反應。

這時使用 ls 命令檢視檔案大小的時候發現,15g 的檔案分割成了 7 份,有乙個竟然有 7g 大小,這時想到可能會有的 set 或 list 很大,占用幾 g 的記憶體也是有可能的。而 awk 長時間處理有可能是因為這些特別大的行。

既然如此,那就只好用別的方法先處理一下檔案了,這裡我考慮取出檔案資料每行的前100個字元,由於鍵都很短,100個字元已經是足夠包括鍵名和型別了。

可是印象中沒有相關的工具或命令,於是找谷哥搜尋一下檔案的大行怎麼處理。。。結果並沒有相應的解決方式,只好考慮自己來寫指令碼了,由於其邏輯並不複雜,而且對效率要求高,就捨棄了 php,準備使用 c 來解決。

整體思想是:利用 c 檔案操作函式fgets(&res, length, file_hanler)在每一行讀到換行符或讀到 length 個字元的特點。如果讀到100個字元還沒有讀到結尾(最後乙個字元不是換行符),就說明此行是乙個大行,那麼就讀取單個字元並丟棄,直到讀到換行符,再繼續處理下一行。

這裡貼上 c 指令碼:

#include #include int main() 

fputc('\n', fp_out);}}

fclose(fp_in);

fclose(fp_out);

}

c 執行得還是很快的,大概三分鐘。執行結束後,再使用 awk 工具,果然很快就把鍵和型別拆了出來。

此時心情大好,果然多掌握一門像 c 這種高效語言就是有用啊。

當從 leader 口中得知 cut 命令時,我的表情是這樣的:

好吧,趕快了解一下 cut 命令:

cut [options] [file.name]:從每個檔案中輸出指定部分到標準輸出。

其選項有:

不光有我指令碼取前 n 個字元的功能,還能直接取第 n 個字段。。

試了下,cut -b 100 rdb.log >>keys.log取前 100 個字元用了 8 分鐘,雖然比 c 指令碼要慢,可是它不用手寫指令碼,而且適用範圍比我寫的指令碼要大。

問題是順利解決了,可是解決過程引起我的思考。這個問題應該會被更快更方便地解決的,搞得這麼麻煩主要是因為linux命令掌握不全

不知道 linux 還有 cut 命令。其實也不是不知道,事後發現我筆記裡已經有了關於 cut 的簡單記錄了,可能是由於命令太過簡單,沒有很多引數,也沒想到太多應用場景,被我記入了 linux 的雜項。

同時也發現了跟 cut 一樣被遺忘的還有其他小知識點,是時候回憶一波了。

我一直認為:解決問題的能力 ~ 個人工具箱的大小。掌握的工具越多,面對問題就會有更多選擇,解決問題也就越得心應手。開發技能是基礎,工具用好才能快速高效地解決問題。

寫幾個常用自動化指令碼、alias簡化一下很長的命令、掌握一些常用的快捷鍵,開發效率就能這麼一點點提公升了。

擴充你的工具箱 大行檔案的處理

前言 前幾天,從 dba 手裡接到乙個 redis rdb 檔案,裡面是 15g 約 660萬 的 redis 鍵值對資料,想通過這些資料提取出當前 redis 的 key 和這些 key 的型別。其檔案的每行結構類似於 key iamatestkey type string expiretime ...

enfp工具箱怎麼用 隱喻 你的工具箱

分享一些在心理諮詢中好用的隱喻。在幫助家庭學習新的溝通方式時,我喜歡 工具箱 這個隱喻。顧名思義,工具箱裡裝著各種各樣的工具,不同工具適用於不同場合。有些工具你裝備了未必用得上,但你不會嫌工具太多。學習一種新的方式,彷彿就要替換掉舊的方式。他會擔心失去一些東西,喚起取捨的焦慮。比如,教乙個人拒絕別人...

Matlab SVM工具箱的使用

2 安裝到matlab資料夾中 2 開啟matlab file set path中新增svm工具箱的資料夾 現在,就成功的新增成功了.可以測試一下 在matlab中輸入which svcoutput 回車,如果可以正確顯示路徑,就證明新增成功了,例如 c program files matlab71...