諸多大網際網路公司的面試都會有這麼個問題,有個4g的檔案,如何用只有1g記憶體的機器去計算檔案中出現次數最多的數字(假設1行是1個陣列,例如qq號碼),如果這個檔案只有4b或者幾十兆,那麼最簡單的辦法就是直接讀取這個檔案後進行分析統計,但是這個是4g的檔案,當然也可能是幾十g甚至幾百g的檔案,這就不是直接讀取能解決了的.
同樣對於如此大的檔案,單純用php做是肯定行不通的,我的思路是不管多大檔案,首先要切割為多個應用可以承受的小檔案,然後批量或者依次分析統計小檔案後再把總的結果彙總後統計出符合要求的最終結果,類似於比較流行的mapreduce模型,其核心思想就是「map(對映)」和「reduce(化簡)」,加上分布式的檔案處理,當然我能理解和使用到的只有reduce後去處理.
假設有1個10億行的檔案,每行乙個6位-10位不等的qq號碼,那麼我需要解決的就是計算在這10億個qq號碼中,重複最多的前10個號碼,使用下面的php指令碼生成這個檔案,很可能這個隨機數中不會出現重複,但是我們假設這裡面會有重複的數字出現,**如下:
$fp = fopen('qq.txt','w+');
for( $i=0; $i<1000000000; $i++ )
fclose($fp);
生成檔案的世界比較長,linux下直接使用php-client執行php檔案會比較節省時間,當然也可以使用其他方式生成檔案,生成的檔案大約11g,然後使用linux split切割檔案,切割標準為每100萬行資料1個檔案,**如下:
split -l 1000000 -a 3 qq.txt qqfile
qq.txt被分割為名字是qqfileaaa到qqfilebml的1000個檔案,每個檔案11mb大小,這時再使用任何處理方法都會比較簡單了,我還是使用php進行分析統計,**如下:
$results = array();
$fp = fopen($file,'r');
$arr = array();
while( $qq = fgets($fp) )
arsort($arr);
//以下處理方式存在問題
do else
} } while(false);
fclose($fp);
} if( $results ) else
} } while(false);
} 這樣每個樣本取前10個,最後放到一起分析統計,不排除有個數在每個樣本中都排名第11位但是總數絕對在前10的可能性,所以後面統計計算演算法還需要改進.
也許有人說使用linux中的awk和sort命令可以完成排序,但是我試了下如果是小檔案還可以實現,但是11g的檔案,不管是記憶體還是時間都無法承受,下面是我改的1個awk+sort的指令碼,或許是寫法有問題,求牛人指導,**如下:
awk -f '\@' ' end ' qq.txt |sort -n > 123.txt
網際網路幾何級增長,未來不管是大檔案處理還是可能存在的大資料都存在很大的需求空間.
java基礎 訪問大檔案資料
實現原理 通過 while 迴圈分次讀取資料 生成輸入流物件 fileinputstream 生成輸出流物件 fileoutputstream 生成位元組字數陣列 btye 1024 通過while 迴圈每次 read 位元組陣列的最大值,當 read 返回值是 1的時候,說明讀取完畢,跳出迴圈 b...
資料統計頁面
麵包屑導航區 class el icon arrow right 首頁 el breadcrumb item 資料統計 el breadcrumb item 資料包表 el breadcrumb item el breadcrumb 卡片檢視區域 為echarts準備乙個具備大小 寬高 的dom m...
tensorflow資料統計
本篇內容包括,tf.norm 張量的範數 tf.reduce min max 最大最小值 tf.argmax argmin 最大最小值的位置 tf.equal 張量的比較 tf.unique 張量的獨特值 1.tf.norm 二範數 x 2 xk 2 1 2 一範數 x 1 xk 無窮範數 x ma...