1. 程式人生 > >海量資料排序總結資料

海量資料排序總結資料

一般解題思路
1
 、將資料匯入到記憶體中 
2
 、將資料進行排序 (比如插入排序、快速排序) 
3
 、將排序好的資料存入檔案難題
一個整數為4 個位元組即使使用陣列也需要900,000,000 * 4byte = 3.4G 記憶體對於32 位系統,訪問2G 以上的記憶體非常困難,而且一般裝置也沒有這麼多的實體記憶體將資料完全匯入到記憶體中的做法不現實其他解決辦法
1
 、匯入資料庫運算 
2
 、分段排序運算 
3
 、使用bit 位運算解決方案一: 資料庫排序將文字檔案匯入到資料庫,讓資料庫進行索引排序操作後提取資料到檔案優點:操作簡單缺點:運算速度慢,而且需要資料庫裝置。解決方案二: 分段排序操作方式:規定一個記憶體大小,比如200M
 ,200M 可以記錄(200*1024*1024/4) = 52428800 條記錄,我們可以每次提取5000萬條記錄到檔案進行排序,要裝滿9 位整數需要20 次,所以一共要進行20 次排序,需要對檔案進行20 次讀操作缺點:編碼複雜,速度也慢( 至少20 次搜尋

關鍵步驟:先將整個9 位整數進行分段,億條資料進行分成20 段,每段5000 萬條在檔案中依次搜尋0~5000 萬,50000001~1 億…… 
將排序的結果存入檔案解決方案三:bit 位操作 思考下面的問題
一個最大的9 位整數為999999999 
9 億條資料是不重複的可不可以把這些資料組成一個佇列或陣列,讓它有0~999999999(10 億個) 元素陣列下標表示數值,節點中用0 表示這個數沒有,1
 表示有這個數判斷0 或1 只用一個bit 儲存就夠了宣告一個可以包含9 位整數的bit 陣列(10 億) ,一共需要10 億/8=120M 記憶體把記憶體中的資料全部初始化為0, 讀取檔案中的資料,並將資料放入記憶體。比如讀到一個數據為341245909 這個資料,那就先在記憶體中找到341245909 這個bit ,並將bit 值置為1 遍歷整個bit 陣列,將bit 為1 的陣列下標存入檔案關鍵程式碼檢查是某一個char 裡面(first) 的第second 位中儲存的資料是否為

bool CompareBit (unsigned char first, int second) 

const static int mark_buf[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; 
if (second > .8) 
return false; 

return (first & mark_buf[second]) == mark_buf[second]; 


將某一個char(Desc) 中的第source 位置為