海量資料的操作

2021-10-04 12:19:00 字數 1058 閱讀 9068

待續。。。

海量資料查詢某個數

海量資料查詢中位數

同樣用二進位制數表示數字,將最高位為0的和最高位為1的數字放到兩個檔案中,假設10億個數字儲存在乙個大檔案中,依次讀一部分檔案到記憶體(不超過記憶體的限制:1gb),將每個數字用二進位制表示,比較二進位制的最高位(第32位),如果數字的最高位為0,則將這個數字寫入 file_0檔案中;如果最高位為 1,則將該數字寫入file_1檔案中。(這裡的最高位類似於快速排序中的樞軸元素)

從而將10億個數字分成了兩個檔案(幾乎是二分的),假設 file_0檔案中有 6億 個數字,file_1檔案中有 4億 個數字。那麼中位數就在 file_0 檔案中,並且是 file_0 檔案中所有數字排序之後的第 1億 個數字。

最高位為符號位,file_1中的數都是負數,file_0中的數都是正數,也即這裡一共只有4億個負數,排序之後的第5億個數一定是正數,那麼排序之後的第5億個數一定位於file_0中。

除去4億個負數,中位數就是6億個正數從小到大排序之後 的第 1 億個數。

現在,只需要處理 file_0 檔案了。同樣採取上面的措施處理:將file_0檔案依次讀一部分到記憶體(不超記憶體限制:1gb),將每個數字用二進位制表示,比較二進位制的 次高位(第31位),如果數字的次高位為0,寫入file_0_0檔案中;如果次高位為1,寫入file_0_1檔案 中。

假設 file_0_0檔案中有3億個數字,file_0_1中也有3億個數字,則中位數就是:file_0_0檔案中的數字從小到大排序之後的第1億個數字。

拋棄file_0_1檔案,繼續對 file_0_0檔案 根據 次次高位(第30位) 劃分,假設此次劃分的兩個檔案為:file_0_0_0中有0.5億個數字,file_0_0_1中有2.5億個數字,那麼中位數就是 file_0_0_1檔案中的所有數字排序之後的 第 0.5億 個數。

按照上述思路,直到劃分的檔案可直接載入進記憶體時,就可以直接對數字進行快速排序,找出中位數了。當然,也可以使用「快排的分割演算法」來找出中位數(比使用快速排序要快)。

【參考文件】

海量資料處理面試題總結

海量資料查詢中位數

海量資料的分頁

第一種方法 declare pagesize int,currpage int,topnum int,previous int select pagesize 30 select currpage 2 select topnum currpage pagesize select previous c...

海量資料的查詢

概述 開發記憶體服務程式,儲存2億資料的索引,用程序通訊管道的管道池進行服務,每次只應付 個請求 服務端 include include include include include include include define totaldata 201515740 資料總量 define bu...

海量資料的處理

最近在網上看到很多關於海量資料的處理方式 看了很多 很暈!其實我想象中的處理方式是 可能在技術上不知道什麼處理,也看了很多資料,說的也是讓你一知半解的方法 這裡我給出的方法並不是我想的那種,但對於處理海量資料的統計,能夠起到一定的效果!1.sql語句的分頁 select top 100 from a...