大数据处理初探

来源:互联网 发布:JS在区间内取随机数 编辑:程序博客网 时间:2024/05/22 04:57

要对一个有几百万行的txt检索出其中的一行:
思路:先计算出具体有多少行,每一行可以看作是一个char *的指针,例如我的renrenwang.txt 有1367866行,那就定义一个char **pp他是一个二级指针,也可以看作是一个指针数组pp[i]表示其中的一行.因为每一行的长度不一样,如果按照最长的一个对其的话,就有可能浪费了许多内存,可以用 fgets(str,275,pf),读取一行放入缓冲区str中,然后strlen求出一行的大小,动态分配此大小的内存空间,再把指向这个内存空间的指针赋值给pp[i],就实现了用一个二级指针管理很多个动态分配的内存.原理如图,图中文件的行数假设为100.
大数据处理

#define _CRT_SECURE_NO_WARNINGS  //关闭安全检查#include<stdio.h>#include<stdlib.h>#include<string.h>char **pp=NULL;//存储指针数组的地址void initdatatomem(char *path){    pp= (char **)malloc(sizeof(char *)* 1367866);    FILE *pf = fopen(path, "r");    if (pf == NULL)    {        printf("fail");    }    else    {        for (int i = 0; i < 1367866; i++)//关键代码        {            char str[275] = {0};            fgets(str, 275, pf);//依次读取            int strlength = strlen(str) + 1;//获取要分配的字符串长度            char *px = (char *)malloc(sizeof(char *)*strlength);//分配内存            strcpy(px, str);            px[strlength - 1] = '\0';//设定最后一个字符为'\0'            pp[i] = px;        }    }    printf("载入内存ok\n");}void *findstr(char *searchstr){    for (int i = 0; i < 1367866; i++)    {        char *ptemp = strstr(pp[i], searchstr);//遍历指针数组  字符串查找        if (ptemp != NULL)        {            printf("\n%s", pp[i]);//打印        }    }}int getfilesize(char *path){    FILE *pf;    pf = fopen(path, "r");//读取方式打开    if (pf == NULL)    {        return -1;//表示打开失败    }    else    {        fseek(pf, 0, SEEK_END);//把文件指针移动到文件末尾        int num = ftell(pf);//获取文件指针开始到当前位置有多少个字节        fclose(pf);        return num;    }}int getn(char *path){    FILE *pf;    pf = fopen(path, "r");//读取方式打开    if (pf == NULL)    {        return -1;//表示打开失败    }    else    {        int i = 0;        while (!feof(pf))//判断是否到了文件末尾        {            char str[275];            fgets(str, 275, pf);//读取一行            i++;//获取有多少行        }        fclose(pf);        return i;    }}void main(){    char *path = "C:\\Users\\Administrator\\Desktop\\大数据\\人人网500W数据库泄露\\renrenwang.txt";    int num = getfilesize(path);    printf("%d字节,%fK,%fM", num, num/1024.0, num/1024.0/1024.0);    printf("\n有%d行", getn(path));//1367866    initdatatomem(path);    char searchstr[100];    scanf("%s", searchstr);    findstr(searchstr);    system("pause");}
0 0