從一道面試題分析海量資料的解決思路

2021-10-13 13:02:53 字數 1052 閱讀 7267

今天看見一道面試題,故寫一下思路,以及分析這類問題深層次考的是我們什麼能力。

題目如下:

假定現在有兩份日誌檔案,乙份是昨天(28日)產出的,乙份是今天(29日)產出的,每份日誌檔案中都有1億個url。請統計今天新增的url數量有多少?

分析思路:

如何判斷是是新增的url

比對兩份日誌檔案,29日與28日中不同的url即算作今日新增

一億個url大致是多大

乙個url大致是60b,那麼一億個的話就是100000000*60b大致為100gb

由於記憶體限制我們是不可能直接將200gb的檔案直接讀入記憶體然後進行比對(就算記憶體允許時間上也不允許),那麼我們如何處理呢?

首先我們應該想到的是分治思想,根據某個規律,將裝有一億個url的檔案分為幾個小的檔案,然後進行小檔案的對比即可。

本道題的解法:

將大檔案按照hash(url)%1000(其實就是將hash對映後的數字取其後三位)這個規律分為1000個小檔案(即小檔案0,小檔案1。。。小檔案999),(你們考慮過這個問題沒有,檔案內容分布不均勻,可能導致有些檔案內容極多,有些極少。針對這個問題就得看hash函式設計的好壞了,乙個好的hash函式可減少衝突,將大檔案很均勻的分割)

分為1000個小檔案,每個檔案大致為100mb,因為使用相同的規律進行檔案分割,即兩個檔案中相同的url一定處於兩個」相同「的小檔案中,比如url同時存在於兩個日誌檔案a,b中,那麼分割之後,該url一定被分割進相同的小檔案ax與bx中

先將小檔案ax中url存入hashset,然後遍歷小檔案bx,若bx中的url可以放入該hashset中,則說明該url沒有出現在昨天的日誌中,即說明其是新增的,計數加1即可

總結:(分治)對於這種海量資料的問題,我們可以採用hash函式將其等價分割(注意:符合一定規律的資料要被分割到同乙個小檔案)變成若干個小檔案再進行處理。這個方法針對資料量巨大,記憶體受到限制時十分有效。

個人覺得這類問題考的是我們對資料的敏感程度,不能只是曉得一億個url很大,具體多大沒有感念。對資料敏感很重要很重要很重要

從一道php面試題說起

面試題目 setcookie name test echo cookies name 請說出程式結果 能說出第一次與第二次的區別者加分 本來一開始我認為不就是設定乙個cookie,然後讀出來的問題,但是被那個後面的提示搞迷惑了從來沒有想過這樣的問題。面試的時候也沒有想出答案,後來在面試官的指點下搞清...

一道面試題的分析

題目 console.log a var a 1 console.log a function a console.log a var a 3 console.log a function a console.log a a 執行結果 分析 題目中有多個變數宣告和函式宣告,都會提公升,而函式的優先順...

一道面試題的分析

在 萬倉一黍 的部落格中看到了 一道有趣的面試題 這篇文章,文中給出了一種解法,仔細想了一下,發現也可以在常數時間複雜度下解決。題目 某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔...