如何給100億個數(shù)字排序?

場景

之前寫過一篇海量數(shù)據(jù)中統(tǒng)計ip出現(xiàn)次數(shù)最多的博客谈宛,今天再寫篇類似的户秤,當然會有不同的地方,相同的地方我快速寫過颠悬,詳細的可以看之前的博客矮燎。

今天要給100億個數(shù)字排序,100億個 int 型數(shù)字放在文件里面大概有 37.2GB赔癌,非常大诞外,內(nèi)存一次裝不下了。那么肯定是要拆分成小的文件一個一個來處理灾票,最終在合并成一個排好序的大文件峡谊。

實現(xiàn)思路

1.把這個37GB的大文件,用哈希分成1000個小文件,每個小文件平均38MB左右(理想情況)靖苇,把100億個數(shù)字對1000取模席噩,模出來的結(jié)果在0到999之間,每個結(jié)果對應(yīng)一個文件贤壁,所以我這里取的哈希函數(shù)是 h = x % 1000悼枢,哈希函數(shù)取得"好",能使沖突減小脾拆,結(jié)果分布均勻馒索。

2.拆分完了之后,得到一些幾十MB的小文件名船,那么就可以放進內(nèi)存里排序了绰上,可以用快速排序,歸并排序渠驼,堆排序等等蜈块。

3.1000個小文件內(nèi)部排好序之后,就要把這些內(nèi)部有序的小文件迷扇,合并成一個大的文件百揭,可以用二叉堆來做1000路合并的操作,每個小文件是一路蜓席,合并后的大文件仍然有序器一。

  • 首先遍歷1000個文件,每個文件里面取第一個數(shù)字厨内,組成 (數(shù)字, 文件號) 這樣的組合加入到堆里(假設(shè)是從小到大排序祈秕,用小頂堆),遍歷完后堆里有1000個 (數(shù)字雏胃,文件號) 這樣的元素
  • 然后不斷從堆頂拿元素出來请毛,每拿出一個元素,把它的文件號讀取出來丑掺,然后去對應(yīng)的文件里获印,加一個元素進入堆述雾,直到那個文件被讀取完街州。拿出來的元素當然追加到最終結(jié)果的文件里。
  • 按照上面的操作玻孟,直到堆被取空了唆缴,此時最終結(jié)果文件里的全部數(shù)字就是有序的了。

最后我用c++寫了個實驗程序黍翎,具體代碼在這里可以看到面徽。

思維拓展

類似的100億個數(shù)字求和,求中位數(shù),求平均數(shù)趟紊,套路就是一樣的了氮双。
求和:統(tǒng)計每個小文件的和,返回給master再求和就可以了霎匈。
求平均數(shù):上面能求和了戴差,再除以100億就是平均數(shù)了
求中位數(shù):在排序的基礎(chǔ)上,遍歷到中間的那個數(shù)就是中位數(shù)了铛嘱。


更正暖释,評論中網(wǎng)友馬敬v,提出了不用對數(shù)字進行哈希墨吓,直接平均分成1000份球匕,進行內(nèi)部排序后,直接進行 k 路歸并排序帖烘,也是可以的亮曹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秘症,隨后出現(xiàn)的幾起案子乾忱,更是在濱河造成了極大的恐慌,老刑警劉巖历极,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窄瘟,死亡現(xiàn)場離奇詭異,居然都是意外死亡趟卸,警方通過查閱死者的電腦和手機蹄葱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锄列,“玉大人图云,你說我怎么就攤上這事×谟剩” “怎么了竣况?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長筒严。 經(jīng)常有香客問我丹泉,道長,這世上最難降的妖魔是什么鸭蛙? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任摹恨,我火速辦了婚禮,結(jié)果婚禮上娶视,老公的妹妹穿的比我還像新娘晒哄。我一直安慰自己睁宰,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布寝凌。 她就那樣靜靜地躺著柒傻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪较木。 梳的紋絲不亂的頭發(fā)上诅愚,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音劫映,去河邊找鬼违孝。 笑死,一個胖子當著我的面吹牛泳赋,可吹牛的內(nèi)容都是我干的雌桑。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼祖今,長吁一口氣:“原來是場噩夢啊……” “哼校坑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起千诬,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤耍目,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后徐绑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邪驮,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年傲茄,在試婚紗的時候發(fā)現(xiàn)自己被綠了毅访。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡盘榨,死狀恐怖喻粹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情草巡,我是刑警寧澤守呜,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站山憨,受9級特大地震影響查乒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萍歉,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一侣颂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枪孩,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攻询,卻和暖如春从撼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钧栖。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工低零, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拯杠。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓掏婶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親潭陪。 傳聞我的和親對象是個殘疾皇子雄妥,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序依溯,而外部排序是因排序的數(shù)據(jù)很大老厌,一次不能容納全部...
    蟻前閱讀 5,164評論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序黎炉,而外部排序是因排序的數(shù)據(jù)很大枝秤,一次不能容納全部...
    每天刷兩次牙閱讀 3,727評論 0 15
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法慷嗜,內(nèi)部類的語法宿百,繼承相關(guān)的語法,異常的語法洪添,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,239評論 0 2
  • 概述排序有內(nèi)部排序和外部排序垦页,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大干奢,一次不能容納全部的...
    Luc_閱讀 2,255評論 0 35