从100亿条记录的文本文件中取出重复数最多的前10条

面对100亿条IP地址的文本文件,大小约为100GB,通过哈希分治策略将其分为10000份,每份10MB以便内存处理。Map阶段由master计算机完成文件划分,Reduce阶段由worker计算机对每个小文件统计最多重复的IP。每个worker返回前10个IP,master再从所有结果中找出全局的前10个重复最多IP。此过程体现了MapReduce的分布式并行处理思想。
摘要由CSDN通过智能技术生成

场景

哈希分治法
这是一个 ip 地址 127.0.0.1
假设有100亿个这样的 ip 地址存在文件中
这个文件大小大约是 100GB
问题:要统计出100亿个 ip 中,重复出现次数最多的前10个

分析

100GB 几乎不可能一次加载进内存进行操作,所以必须要拆分
那么可以利用分治的思想,把规模大的问题化小,然后解决各个小的问题,最后得出结果。

实现思路

  • ipv4 地址是一个 32 位的整数,可以用 uint 保存。
  • 我先设计一个哈希函数,把100个G的文件分成10000份,每份大约是 10MB,可以加载进内存了。
例如:我设计一个简单的哈希函数是 f(ip) = ip % 10000,(ip 是个32位整数)
那么 5 % 10000 = 5,不管 5 在哪个地方 5 % 10000 的结果都是 5,这就保证了相同的 ip 会被放在同一个子文件中,方便统计&#
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAX_WORD_LEN 100 // 最大单词长度 #define TOP_N 10 // N个出现次数最多的单词 // 单词结构体 typedef struct { char word[MAX_WORD_LEN]; // 单词 int count; // 出现次数 } Word; // 比较函数,用于qsort排序 int cmp(const void *a, const void *b) { return ((Word *)b)->count - ((Word *)a)->count;} int main() { char filename[100]; // 文件名 printf("请输入文件名:"); scanf("%s", filename); FILE *fp = fopen(filename, "r"); // 打开文件 if (fp == NULL) { printf("文件打开失败!\n"); return 0; } Word *words = (Word *)malloc(sizeof(Word) * 1000); // 动态分配内存 int wordCount = 0; // 单词数量 char word[MAX_WORD_LEN]; // 临时存储单词 int len = 0; // 单词长度 char c; // 临时存储字符 while ((c = fgetc(fp)) != EOF) { // 逐个字符读取文件 if (isalpha(c)) { // 如果是字母 if (len < MAX_WORD_LEN - 1) { // 如果单词长度未超过最大长度 word[len++] = tolower(c); // 转换为小写字母并存储 } } else if (len > 0) { // 如果不是字母且单词长度大于0 word[len] = '\0'; // 添加字符串结束符 int i; for (i = 0; i < wordCount; i++) { // 查找单词是否已存在 if (strcmp(words[i].word, word) == 0) { // 如果已存在 words[i].count++; // 出现次数加1 break; } } if (i == wordCount) { // 如果不存在 strcpy(words[wordCount].word, word); // 存储单词 words[wordCount].count = 1; // 出现次数为1 wordCount++; // 单词数量加1 } len = 0; // 重置单词长度 } } fclose(fp); // 关闭文件 qsort(words, wordCount, sizeof(Word), cmp); // 按出现次数排序 printf("出现次数%d的单词:\n", TOP_N); int i; for (i = 0; i < TOP_N && i < wordCount; i++) { // 输出N个单词 printf("%s\t%d\n", words[i].word, words[i].count); } free(words); // 释放内存 return 0; } ``` --相关问题--: 1. 如何统计一个文本文件出现次数最多的十个汉字
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值