問題:資料太大,在記憶體中無法一次性裝入。
分析:100億就是大約就是10g,對於現在的計算機而言,記憶體中無法容納這麼大的檔案。
解決:將乙個大檔案切分為多個小檔案,例如:我們可以將該100億的大檔案切分為1000個檔案,即每個檔案的大小大約就是10m,那麼就可以在記憶體中容納得下了。
那麼,我們要怎麼來切分這個100億的大檔案呢?平均分?很顯然是不可以的,如果分到某個檔案的ip位址出現的次數都是1次,那麼該檔案出現最多的ip就是這10m個ip。那麼就會浪費很大的空間,不符合我們的預期。所以,在此我們可以採用雜湊表的方式,對ip先轉換為對應的整數,在對該數取模,將模相同的ip放在同乙個檔案之中,那麼這樣在同乙個檔案中出現ip相同的概率就會大一些。
然後我們就可以分別統計出這1000個檔案中ip次數最多的ip,然後再將這1000個檔案進行彙總。如下面的**。
題2:給定100億個整數,找到其中只出現一次的整數。
分析:遇到這樣的問題,我們首先想到的處理方法就是:使用乙個輔助陣列,用來儲存每個資料出現的次數。那麼我們就需要100億大小的陣列。100億 = 10g = 10 * 4 = 40g,可能就需要40g的記憶體,明顯對於當代的計算機是不可能的。
解決:我們需要的結果是找出出現一次的數字,我們知道,位圖可以用來表示乙個數字是否存在,可是我們現在要找的數字是出現一次的數字。所以,我們可以將之前的點陣圖進行擴充套件。例如:我們使用兩位來表示乙個數字的存在狀態。00:表示該數字不存在;01:表示該數字存在1次;11:表示該數字出現了多次。那麼,這樣100億個數字就只要200億個位,即需要25億位元組,即需要2.5個g就可以進行統計了。在查詢的過程中,我們只需要判斷是否是01,如果是那麼就是我們要找的那個數字。
題3:有兩個檔案,分別由100億個query(查詢詞,即字串),但是只有1g的記憶體,找到兩個檔案的交集。
分析:對於這樣的 大檔案,同樣的我們不能對其進行處理。因為在當代的計算機中並不能儲存這麼大的資料。
解決:與問題一相似,首先將這兩個大檔案進行切分。切分完後,就產生了很多小檔案,檔案1:file1.1,file1.2,file1.3,file1.4,file1.5,…….檔案2:file2.1,file2.2,file2.3,file2.4,file2.5,…….然後我們將file1中的所有小檔案採用布隆過濾器儲存,然後再處理檔案2的小檔案,在處理檔案2的小檔案時,若file1中也存在該檔案,我們就把它儲存於另外乙個檔案中。當檔案2的所有小檔案處理完時,也就找到了兩個檔案的交集。
題4:給定上千個檔案,每個檔案的大小為1k-100m,請設計演算法找到某個詞存在於哪些檔案之中。
解決:首先我們了解一下什麼是正排索引,什麼是倒排索引。
簡單的說,正排索引就是根據編號去找對應的資料;而倒排索引就是根據資料去找編號。詳解如下圖所示:
那麼,顯而易見,對於這個問題我們就要使用倒排索引的方式:
解決過程:
首先將每個檔案的資料對應的儲存到乙個布隆過濾器之中,可能會存在很多個布隆過濾器。
然後我們讀取每乙個布隆過濾器中的詞,並且記錄每個詞和其對應的檔案,將其儲存在另外乙個檔案中,假設這個檔案叫做information。(即倒排索引的方式儲存)
將所有的詞分為幾個小部分,分別儲存到布隆過濾器中。
當遇到乙個詞後,我們就要判斷該詞是否存在。那麼,此時我們就可以在儲存單詞的布隆過濾器中查詢,判斷該詞是否存在。
a.遍歷所有儲存單詞的布隆過濾器,如果存在,也就可以找到其對應的檔案了。若不存在,那麼該單詞不在這些檔案之中。
總結:對於大數的處理方法:
切分使用雜湊,位圖,布隆過濾器等演算法。。。。。。。
Pandas處理「大」資料的一些技巧
實習定下來下的空檔期,抽空參加了一些大資料競賽,pandas用的比較多,所以這裡彙總下pandas的一些使用心得和總結一些遇到過的問題吧。import pandas as pd res for dfs in pd.read csv data.csv chunksize 1000 iterator t...
資料處理的一些方法
1 保留小數點後兩位 四捨五入alert num.tofixed 2 2 保留小數點後兩位 把後面捨去math.floor 15.7784514000 100 100 輸出結果為 15.77 yuantocent yuan yuantocent 5.55 100 呼叫時需要除以100之後數值才是對應...
對於nandflash壞塊的一些處理辦法
對於壞塊的處理 使用 nandflash,免不了出現個別的壞塊,一般情況下,有一些壞塊是正常的,也不會影響系統的正常啟動執行。如果出現因為壞塊無法啟動 linux 作業系統,那就需要乙個方法來處理這些邏輯上的壞塊 實際上壞塊不一定是真的壞了 邏輯壞塊引起的系統無法啟動,可以使用下面這種方法 開機按下...