内存数据查询

海量数据查询:

由于要查询的数据较多,如果在磁盘上进行查询则速度较慢,这时可以把要查询的相关数据读到内存中,然后再进行查询。

这儿是使用的把数据按行读入到内存中,然后在内存中进行查询。

这儿需要注意的几个问题是开辟内存时的初始化工作,

比如初始化 memset(g_bh, "\0", sizeof(char *)*NUM); //初始化时这儿不小心把 '\0' 写成了 "\0",结果造成了意想不到的程序崩溃...
样的大意造成的后果不太会查。所以一定要小心。

由于此处用了大量的分配内存 malloc,一是分配后要进行初始化工作,二是要进行分配后的判断内存分配是否成功。


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>


#define NUM 2027358
//#define LINE 254	//一行最大长度

char **g_bh;


int getnum(char *path)		//得到行数
{
	int num = 0;	//统计行数
	FILE *pfr = fopen(path, "r");
	if (pfr == NULL)
	{
		return -1;
	}
	else
	{
		char str[256] = { 0 };
		while (fgets(str, 255, pfr))
		{
			num++;
		}
	}
	return num;
}

int getmax(char *path)	//得到最大行数据长度
{
	int num = 0;	//统计行数
	FILE *pfr = fopen(path, "r");
	if (pfr == NULL)
	{
		return -1;
	}
	else
	{
		char str[1024] = { 0 };
		while (fgets(str, 255, pfr))
		{
			int length = strlen(str);
			if (num < length)
				num = length;
		}
	}
	return num;
}

void getmem(char *path)
{
	//初始化
	printf("init start...\n");
	g_bh = malloc(sizeof(char *)*NUM);	//分配内存
	//初始化时这儿不小心把 '\0' 写成了 "\0",结果造成了意想不到的程序崩溃...	
	//memset(g_bh, "\0", sizeof(char *)*NUM);	
	memset(g_bh, '\0', sizeof(char *)*NUM);		//初始化
	FILE *pfr = fopen(path, "r");
	if (pfr == NULL)
	{
		return;
	}
	else
	{
		for (int i = 0; i < NUM; i++)
		{
			char str[1024] = { 0 };
			fgets(str,1024, pfr);
			int length = strlen(str);
			if (length >=1)        
			{
				g_bh[i] = malloc(sizeof(char)*length+1);
				memset(g_bh[i], '\0', length+1);		//初始化
				if (g_bh[i] != NULL)	//如果内存分配成功则拷贝数据
				{
					strcpy(g_bh[i], str);
				}							
			}
		
		}
	}

	fclose(pfr);
	printf("init end\n");

}

void  search(char *search)
{
	//从读到内存中的数据中查询数据
	int num = 0;
	for (int i = 0; i < NUM; i++)
	{
		if (g_bh[i] != NULL)	//做大数据一定要严禁,否则出错就讨厌了。
		{
			if (strstr(g_bh[i], search))
			{
				printf("\n %d:%s\n", ++num, g_bh[i]);
			}
		}
		
	}
}

char *path = "E:\\baihe.txt";

void main()
{
	//printf("%d\n", getnum(path));d
	//printf("%d\n", getmax(path));
	//printf("开始读入数据到内存......\n");
	Sleep(5000);
	getmem(path);

	while (1)
	{
		printf("请输入要查询的名字:");
		char name[30];
		scanf("%s", name);
		search(name);

	}

	

	system("pause");
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值