文章目录
1.介绍
本文使用hash方法将一个大数据文件散列成多个文件进行处理,从而降低了文件的IO操作,提高了程序的效率。
2.大数据处理的实现
2.1 头文件和宏
#include <stdio.h>
#include <assert.h>
#include <random>
#define MIX_NUM 100000//所有的数字个数
#define ITEM_NUM 10000//每个单元的处理个数
2.2 创建一个数对的结构体
//创建一个数对的结构体
typedef struct Pair
{
int num;//数字
int times;//次数
}Pair;
2.3 随机产生MIX_NUM个数字
没有现成的大数据,我们可以在程序中随机生成大数据进行模拟大数据的处理
//随机产生MIX_NUM个数字
void CreatFile_BigData(const char* path)
{
FILE* fw = fopen(path,"wb");//写入二进制数据
assert(fw != nullptr);
int tmp;
for (int i = 0;i < MIX_NUM;i++)
{
tmp = rand();
fwrite(&tmp, sizeof(int), 1, fw);
}
fclose(fw);
}
2.4 统计hash文件中出现次数最多的数字
//统计hash文件中出现次数最多的数字,计数器限制为ITEM_NUM
Pair HashFile(const char* path)
{
int* arr = (int*)calloc(ITEM_NUM, sizeof(int));
FILE* fr = fopen(path, "rb");
assert(fr != nullptr);
int tmp;
//统计每个数字出现的次数
while (fread(&tmp, sizeof(int), 1, fr) > 0)
{
arr[tmp / 4]++;
}
//找到出现次数最多的数字
Pair pa = { 0 };
for (int i = 0;i < ITEM_NUM;i++)
{
if (pa.times < arr[i])
{
pa.num = i * 4 + tmp % 4;
pa.times = arr[i];
}
}
fclose(fr);
free(arr);
return pa;
}
2.5统计大数据中出现次数最多的数字
//统计文件中出现的最大次数,内存有限制为ITEM_NUM
Pair Maxtimes(const char* path)
{
int* arr = (int*)calloc(ITEM_NUM, sizeof(int));
FILE* fr = fopen(path, "rb");
int tmp;
char patharr[4][20];
for (int i = 0;i < 4;i++)
{
sprintf(patharr[i], "%d.txt", i);
}
FILE* fw[4];
for (int i = 0;i < 4;i++)
{
fw[i] = fopen(patharr[i], "wb");
}
//将原来的数据散列到四个hash文件中,降低文件的读写次数(文件IO)
while (fread(&tmp, sizeof(int), 1, fr) > 0)
{
fwrite(&tmp, sizeof(int), 1, fw[tmp % 4]);
}
for (int i = 0;i < 4;i++)
{
fclose(fw[i]);
}
Pair paArr[4];
for (int i = 0;i < 4;i++)
{
paArr[i] = HashFile(patharr[i]);
}
int index = 0;//保存次数最多的数据下标
for (int i = 0;i < 4;i++)
{
if (paArr[index].times < paArr[i].times)
{
index = i;
}
}
return paArr[index];
}
2.6 实现
int main()
{
const char* path = "BigData.txt";
CreatFile_BigData(path);
Pair pa = Maxtimes(path);
printf("内存没有限制时的统计数字=%d,次数=%d", pa.num, pa.times);
return 0;
}