1. 程式人生 > >1、(topK問題)海量日誌資料,提取出某日訪問百度次數最多的10個IP。

1、(topK問題)海量日誌資料,提取出某日訪問百度次數最多的10個IP。

#include <iostream>
#include <fstream>
#include <string.h>
#include <ctime>
#include <hash_map>


#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>




using namespace std;
using namespace __gnu_cxx;


#define TRUE1
#define FALSE0
#define UP184549374/* 10.255.255.254 */
#define LOW167772161/* 10.0.0.1 */
#define DIVIDENUM1000
#define USERLOGFILE"userlog.dat"


int generatelogfile(void)
{
unsigned int i;
unsigned int j;
int ret;
struct in_addr userip;
fstream userlog;


userlog.open(USERLOGFILE, ios::out | ios::in | ios::trunc);


srandom((unsigned int)time(NULL));


for (i = 1; i <= 128 * 1024; i++)
{
string str;


str.clear();
for (j = 1; j <= 1024; j++)
{
//userip.s_addr = random();
userip.s_addr = (random() % (UP - LOW + 1)) + LOW;
userip.s_addr = htonl(userip.s_addr);
if ((userip.s_addr & 0xFF) == 0)
{
userip.s_addr += 1;
}
if ((userip.s_addr & 0xFF) == 0xFF)
{
userip.s_addr -= 1;
}


if ((userip.s_addr & 0xFF000000) == 0)
{
userip.s_addr += 0x0A000000;
}


if ((userip.s_addr & 0xFF000000) >= 0xE0000000)
{
userip.s_addr -= 0xDF000000;
}


//if (i % 1024 == 0)
//printf("%X: \n", i);
userip.s_addr = ntohl(userip.s_addr);
str = str + inet_ntoa(userip) + "\r\n";
}
userlog << str;
//userlog << inet_ntoa(userip) << endl;
//printf("%-15s\n", inet_ntoa(userip));
}


userlog.close();
return 0;
}


void dividelogfile(void)
{
unsigned int i;
char line[256];
char filename[50];
fstream userlog;
fstream userlogfile[DIVIDENUM];
struct in_addr userip;


userlog.open(USERLOGFILE, ios::in);


for (i = 0; i < DIVIDENUM; i++)
{
memset(filename, 0, sizeof(filename));
sprintf(filename, "./data/%s_%d.dat", "userlog", i);
userlogfile[i].open(filename, ios::out | ios::in | ios::trunc);
}


do
{
memset(line, 0, sizeof(line));
userlog.getline(line, 256);
inet_aton(line, &userip);
//printf("%s\n", line);
userip.s_addr = htonl(userip.s_addr);
//userlogfile[userip.s_addr % DIVIDENUM] << line << endl;
userlogfile[userip.s_addr % DIVIDENUM] << line << "\n";
//printf("0x%X\n", userip.s_addr);
} while (!userlog.eof());


userlog.close();
for (i = 0; i < DIVIDENUM; i++)
{
userlogfile[i].close();
}
}


typedef struct __min_heap
{
struct in_addr userip;
unsigned count;
} MIN_HEAP;


void ajustDown(MIN_HEAP *minheap, int i, int n)
{
int j;
MIN_HEAP tmpnode;


j = 2*i + 1;


while (j < n)
{
if ((j + 1) < n && (minheap[j + 1].count < minheap[j].count))
{
j++;
}


if (minheap[i].count > minheap[j].count)
{
tmpnode = minheap[i];
minheap[i] = minheap[j];
minheap[j] = tmpnode;
}


i = j;
j = 2*i + 1;
}
}


void makeMinHeap(MIN_HEAP *minheap, int len)
{
int i;


for (i = len/2 - 1; i >= 0; i--)
{
ajustDown(minheap, i, len);
}
}


void minHeapSort(MIN_HEAP *minheap, int len)
{
int i;
MIN_HEAP tmpnode;


makeMinHeap(minheap, len);
for (i = len - 1; i >= 0; i--)
{
tmpnode = minheap[0];
minheap[0] = minheap[i];
minheap[i] = tmpnode;
ajustDown(minheap, 0, i);
}
}


void parse(void)
{
unsigned int i;
char line[256];
char filename[50];
fstream userlog;
fstream userlogfile[DIVIDENUM];
struct in_addr userip;
hash_map<int, int> hm;


MIN_HEAP top_k[10];
memset(top_k, 0, sizeof(top_k));


for (i = 0; i < DIVIDENUM; i++)
{
memset(filename, 0, sizeof(filename));
sprintf(filename, "./data/%s_%d.dat", "userlog", i);
userlogfile[i].open(filename, ios::in);


hm.clear();



while (!userlogfile[i].eof())
{
memset(line, 0, sizeof(line));
userlogfile[i].getline(line, 256);
inet_aton(line, &userip);
userip.s_addr = htonl(userip.s_addr);
if (userip.s_addr == 0x00)
{
continue;
}
hm[userip.s_addr] = hm[userip.s_addr] + 1;
}

if (hm.size() > 0)
{
printf("hm.size = %d\n", hm.size());
for(hash_map<int, int>::iterator itb = hm.begin(); itb != hm.end(); itb++)
{


if (itb->second > top_k[9].count)
{
top_k[9].userip.s_addr = itb->first;
top_k[9].count = itb->second;
minHeapSort(top_k, 10);
}
}
}


for (int j = 0; j < 10; j++)
{
printf("%s %d\n", inet_ntoa(top_k[j].userip), top_k[j].count);
}
}


for (i = 0; i < DIVIDENUM; i++)
{
userlogfile[i].close();
}
}




int main(int argc, char *argv[])
{
/*  生成樣本資料*/
//generatelogfile();


/*  分治*/
//dividelogfile();


/*  統計*/
parse();


return 0;
}


相關推薦

1(topK問題)海量日誌資料提取某日訪問次數10IP

#include <iostream>#include <fstream>#include <string.h>#include <ctime>#include <hash_map>#include <sys/socket.h>#incl

海量日誌資料出現次數IP地址

import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java

【hadoop】1MapReduce進行日誌分析並排序統計結果

1.網上很多關於搭建Hadoop叢集的知識,這裡不多做敘述,並且本機執行Hadoop程式是不需要hdfs叢集的,我們本機執行只做個demo樣式,當真的需要執行大資料的時候,才需要真正的叢集 2.還有就是詞頻統計的知識,不論是官方文件,還是網上的知識,基本都能隨意百度個幾百篇出來 但是我找半天,確實是沒有找

JAVA找List集合中重複次數資料次數

import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Ent

給定一個字串不含有重複字元的長子串的長度 示例: 給定 "abcabcbb" 沒有重複字元的長子串是 "abc" 那麼長度就是3 給定 "bbbbb" 長的子串就是 "b

Str = raw_input('plese input Str:') def qiu_chongfu(Str2):#定義判斷字串是否含有重複字元,如有返回0,沒有返回1 biao = 0 for i in range(0,len(Str2)): for j in

給定一個字串不含有重複字元的長子串的長度

題目描述:   給定一個字串,找出不含有重複字元的最長子串的長度。 思路1:   依排列組合的所有可能拿到所有子串,依次傳入重複子穿的判斷方法中進行判斷,每次更新出不重複子串的最大長度! 具體程式碼:   1 import java.util.Scanner; 2 3 pu

給定一個長度不限的字串請找該字串中出現次數的那個字元並打印該字元及出現次數(C/C++版)

#include<iostream> using namespace std; /** * @brief findchar 給定一個長度不限的字串,請找出該字串中出現次數最多的那個字元,並打印出該字元及出現次數; 如果多個字元的出現次數相同,只打印首個

LeetCode 第3題:給定一個字串不含有重複字元的長子串的長度

public class LeetCode3 { public static void main(String[] args) { /** * LeetCode第3題: * 給定一個字串,找出不含有重複字元的最

Flume(NG)架構設計要點及配置實踐 Flume NG是一個分散式可靠可用的系統它能夠將不同資料來源的海量日誌資料進行高效收集

Flume(NG)架構設計要點及配置實踐 Flume NG是一個分散式、可靠、可用的系統,它能夠將不同資料來源的海量日誌資料進行高效收集、聚合、移動,最後儲存到一箇中心化資料儲存系統中。由原來的Flume OG到現在的Flume NG,進行了架構重構,並且現在NG版本完全

haproxy 1.8版本沒有日誌輸出參考1.7版本配置

一、問題、haproxy啟動後, 重新安裝haproxy1.8版本,配置好haproxy.cfg,可以測試到轉發效果,但是/var/log下沒有haproxy.log日誌,看不到請求連結資料以及重啟haproxy.cfg資訊 二、參考網上,修改/etc/haproxy/

收集分析線上日誌資料實戰——ELK

本文來自網易雲社群 作者:田躲躲 使用者行為統計(User Behavior Statistics, UBS)一直是網際網路產品中必不可少的環節,也俗稱埋點。對於產品經理,運營人員來說,埋點當然是越多,覆蓋範圍越廣越好。通過使用者行為分析系統可洞悉使用者基本操作習慣、探析使用者心理。通過行為資料的補充,構

1CAN詳解--資料彙總

資料彙總 一、書籍 二、網站 三、知名博主 四、資料連結 一、書籍 1、《CAN匯流排嵌入式開發——從入門到實戰》 [第二版],作者 牛躍聽,周立功 2、《CAN匯流排應用層協議例項解析》 作者 牛躍聽 周立功 3、《CAN

海量日誌資料__怎麼在海量資料中找重複次數的一個

 問題一: 怎麼在海量資料中找出重複次數最多的一個 演算法思想: 方案1:先做hash,然後求模對映為小檔案,求出每個小檔案中重複次數最多的一個,並記錄重複次數。         然後找出上一步求出的資料中重複次數最多的一個就是所求(如下)。 問題二:    

2.6使用二維陣列儲存學生的資料,包括學號姓名作業系統成績Java成績高數成績總分;一行儲存一個學生的資料;要求輸入若干學生的資料,總分;然後按照總分由高到低重新排列;輸出排序後的結果

摩爾的Java學習筆記2.6 第二週作業: 1、實現將一組整數進行升序排列; 2、用二維陣列實現,5個學生4門課程的總分和平均分的統計工作; 3、列印八行八列楊輝三角,開頭

經典面試問題: Top K 之 ---- 海量資料找出現次數不重複的

作者:林冠巨集 / 指尖下的幽靈 僅列舉一些解決方法,事實的解決方案是非常多的。 這些問題都是面臨著有如下的考慮: 記憶體不足以放下所有的數。 機器CPU的核數不夠。 ... 問這些問題的意義: 如果能把這些問題答好,必然是綜合計算機各方面的知識,從記憶體到資料結構甚至還涉及到硬體,方法面面

python初學筆記 1python的輸入輸出基本運算流程控制

縮進 接收 bubuko 其他 不同等級 -c 技術 運算 con ---恢復內容開始--- 一、輸入輸出 python的輸入輸出很簡單,輸入語句是input(),不需要提前定義數來接收,可以直接運用。(我用的開發軟件是JetBrains PyCharm Commu

14海量日誌提取出現次數IP

    問題描述:現有某網站海量日誌資料,提取出某日訪問該網站次數最多的那個IP。     分析:IP地址是32位的二進位制數,所以共有N=2^32=4G個不同的IP地址, 如果將每個IP地址看做是陣列的索引的話,那麼需要建立一個unsigned count[N]的陣列,

linux分析apache日誌訪問次數的前10IP訪問超過100次的頁面

apache日誌分析可以獲得很多有用的資訊,現在來試試最基本的,獲取最多訪問的前10個IP地址及訪問次數。 既然是統計,那麼awk是必不可少的,好用而高效。 命令如下: awk '{a[$1] += 1;} END {for (i in a) printf("%d

1s32v234學習筆記--資料彙總

一、介紹 1、恩智浦S32汽車電子平臺是全球首款可擴充套件汽車電子計算架構。該產品可提供跨多個應用領域的統一硬體平臺和軟體環境,幫助加速車內體驗和自動駕駛功能的開發。 二、ADAS-S32V 1、ADAS應用示例 (1)自動緊急剎車(AEB) (2)車道偏離糾正(L

1、connect方法會阻塞請問有什麼方法可以避免其長時間阻塞? 答:通常的方法有效的是加定時器;也可以採用非阻塞模式 2網路中如果客戶端突然掉線或者重啟伺服器端怎麼樣才能立刻知道? 答

3.在子網 />答: 簡: 30表示的是網路號(network number)是30位,剩下2位中11是廣播(broadcast)地址,00是multicast地址,只有01和10可以作為host address。 詳: />代表的子網的網路號是30位,即網路號是 & =,此子網的地址空間