大数据处理初探

要对一个有几百万行的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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值