Shell 排序大檔案

2021-07-09 09:18:57 字數 1726 閱讀 6152

題目:一句 shell 指令碼,使用 2g 記憶體,排序乙個 10g 的檔案。

首先,我們用 python 指令碼計算乙個 10g 的檔案最大的整數是多少(因為硬碟的原因就以 10m 為例),10m 得到的結果是 1449607。

123

4567

891011

1213

1415

1617

1819

2021

2223

total

=1024

*1024*10

total-=2

count=0

fori

inrange(1

,100000

):size=(

10**i-

10**(i

-1))*

(i+1

)iftotal

>=

size

:total

-=size

count=i

else

:break

print

(total/(

count+2

))-1+

10**

count

print

"remain bytes: "

,total%(

count+2

)# 只做小資料時驗證使用

total

=1024

*1024*10

fori

inrange(0

,10000000

):total

-=len

(str(i

))+1if

total

<0:

printi-

1print

"remain bytes: "

,total

+len

(str(i

))+1break

然後,呼叫 seq 和 shuf(在 os x 下可以先執行 brew install coreutils 安裝軟體包,然後使用 shuf)命令生成打亂的檔案。

1

2

seq -f '%0.f' 0 1449607 > old_dat

gshuf old_data -o old_data2

由於 sort 命令會把所有傳遞給它的數字存在記憶體裡排序,所以把所有的內容分為幾部分進行排序可以減少 sort 所占用的記憶體。雖然多掃了幾次檔案,但是記憶體可以少占用很多。由於我們最大的數字就是 1449607,還不到 2m 個數字,所以每次處理 1m 的話,分兩次就搞定了。

1

23

for i in `seq 0 1`;

do awk 'begin' old_data2 | sort -g >> new_data;

done;

最後,比較一下排序出的檔案與最初的檔案是否相同,相同就說明我們的命令寫對了。

1

diff old_data new_data

這還只是乙個很粗淺的方法,但是摸索的過程中學到了很多 shell 的知識。後續可能會找個工具測一下 sort 命令的執行效率,進而給出更準確的答案。

- eof -

LINUX AIX UNIX 大檔案排序問題

上週經理讓我在unix環境下 對乙個150m 的txt 的第一列進行排序,組內以前有人寫過乙個程式,用結構體 冒泡法 共享記憶體 排序,但是後面發現只能對百萬行的資料排序,如果檔案過大,申請不到共享記憶體,現在機器上一般共享記憶體限制2g。比較笨的方法是 匯入資料庫,然後order by 再匯出來。...

c語言大檔案排序

一 生成大檔案 int main void srand size t time null for int i 0 i size i fclose fp return 0 對大檔案進行排序 int main void int arr 256 memset arr,0,sizeof int 256 fo...

學習 大檔案統計與排序

這篇主要記錄一下學習陳碩同學的對下面這道題的演算法思想與 題目是這樣的 有10個檔案,每個檔案1g,每個檔案的每行存放的都是使用者的query 請自己隨機產生 每個檔案的query都可能重複。要求你按照query的頻度排序。當然,這裡的重點是大檔案,所以10個1g的檔案,或者1個10g的檔案,原理都...