題目:一句 shell 指令碼,使用 2g 記憶體,排序乙個 10g 的檔案。
首先,我們用 python 指令碼計算乙個 10g 的檔案最大的整數是多少(因為硬碟的原因就以 10m 為例),10m 得到的結果是 1449607。
123total4567
891011
1213
1415
1617
1819
2021
2223
=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
(total/(
count+2
))-1+
10**
count
"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)命令生成打亂的檔案。
12
seq -f '%0.f' 0 1449607 > old_dat
gshuf old_data -o old_data2
由於 sort 命令會把所有傳遞給它的數字存在記憶體裡排序,所以把所有的內容分為幾部分進行排序可以減少 sort 所占用的記憶體。雖然多掃了幾次檔案,但是記憶體可以少占用很多。由於我們最大的數字就是 1449607,還不到 2m 個數字,所以每次處理 1m 的話,分兩次就搞定了。
123
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的檔案,原理都...