内存数据查询

    xiaoxiao2026-06-21  10

    海量数据查询:

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

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

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

    比如初始化 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"); }

    转载请注明原文地址: https://ju.6miu.com/read-1310756.html
    最新回复(0)