C语言实现大数据处理

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;
}
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值