PHP およびシェルの大きなファイル データの統計と並べ替え方法

WBOY
リリース: 2016-07-25 09:12:56
オリジナル
984 人が閲覧しました

このセクションの内容: シェルとphpを使ってビッグデータを並べ替える方法

ビッグデータの問題、たとえば、4G ファイルがある場合、1G メモリしか搭載していないマシンを使用して、ファイル内の最頻値を計算する方法 (1 行が配列であると仮定します。QQ 番号など)。 ファイルがわずか 4B または数十メガバイトの場合、最も簡単な方法は、ファイルを直接読み取り、分析と統計を実行することです。ただし、これは 4G ファイルです。当然、数十 G、場合によっては数百 G になる可能性があります。これは直接読み込むことで解決できません。

このような大きなファイルの場合と同様に、PHP だけを使用するのは決して現実的ではありません。ファイルがどんなに大きくても、まず複数のアプリケーションで使用できる小さなファイルに分割し、次に小さなファイルに分割する必要があるということです。ファイルはバッチまたは順番に分析およびカウントでき、合計結果が要約され、要件を満たす最終結果が得られます。人気のある MapReduce モデルと同様に、その中心的な考え方は「Map (マッピング)」と「Reduce (簡略化)」であり、それに加えて分散ファイル処理は、もちろん、処理に使用できるのは Reduce だけです。

10 億行のファイルがあり、各行に 6 桁から 10 桁の QQ 番号があるとします。解決する必要があるのは、次の PHP を使用して、これらの 10 億 QQ 番号の中で最も頻繁に繰り返される上位 10 個の番号を計算することです。スクリプトはこのファイルを生成します。この乱数には重複はない可能性がありますが、重複する数字が存在すると想定されます。

例えば、

  1. $fp = fopen('qq.txt','w+');
  2. for( $i=0; $i<1000000000; $i++ ){
  3. $str = mt_rand( 10000,9999999999)."n";
  4. fwrite($fp,$str);
  5. }
  6. fclose($fp);
コードをコピー

ファイル生成の世界は比較的長いです php-client を直接使用します。 Linux では PHP ファイルを実行すると時間を節約できます。もちろん、他の方法を使用してファイルを生成することもできます。生成されるファイルは約11Gです。 次に、Linux Split を使用してファイルを切り取ります。切り取りの標準は、データ 100 万行ごとに 1 ファイルです。 split -l 1000000 -a 3 qq.txt qqfile qq.txt は qqfileaaa から qqfilebml という名前の 1000 個のファイルに分割されており、各ファイルのサイズは 11MB です。現時点ではどのような処理方法を使用しても比較的簡単です。

分析と統計には PHP を使用します。

  1. $results = array();
  2. foreach( glob('/tmp/qq/*') as $file ){
  3. $fp = fopen($file,'r') ;
  4. $arr = array();
  5. while( $qq = fgets($fp) ){
  6. $qq = トリム($qq);
  7. isset($arr[$qq]) $arr[$qq]+ ? + : $arr[$qq]=1;
  8. }
  9. arsort($arr);
  10. //以下の処理方法に問題があります
  11. do{
  12. $i=0;
  13. foreach( $arr as $qq= >$times ){
  14. if( $i > 10 ){
  15. isset($results[$qq]) $results[$qq]+=$times :$results[$qq]=$times;
  16. $ i++;
  17. } else {
  18. Break;
  19. }
  20. }
  21. } while(false);
  22. fclose($fp);
  23. }
  24. if( $results ){
  25. arsort($results);
  26. do{
  27. $i= 0;
  28. foreach ( $results as $qq=>$times ){
  29. if( $i > 10 ){
  30. echo $qq . $times "n" ;
  31. $i++;
  32. } {
  33. Break;
  34. }
  35. }
  36. } while(false);
  37. }
各サンプルの上位 10 個が取得され、最終的に分析と統計のためにまとめられるように、コードをコピーします

各サンプルには 11 位にランクされる数値が存在するが、合計の数値は間違いなく上位 1​​0 位にあるため、後続の統計計算アルゴリズムを改善する必要があると除外されました。 Linux の awk や sort コマンドを使えばソートできるという人もいるかもしれないが、試してみたところ、小さいファイルならなんとかなるが、11G のファイルとなるとメモリも時間も耐えられない。

1 awk+sort スクリプト: awk -F '\@' '{name[$1]++ } END {for (名前の数) print name[count],count}' qq.txt |sort -n > 123.txt 大きなファイルの処理であれ、ビッグデータの可能性であれ、大きな需要があります。



ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!