c++ - linux下如何用C语言读取大于10G的文件?

查看:164
本文介绍了c++ - linux下如何用C语言读取大于10G的文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

需求**:

 有一个15G左右的日志文件,文件中每一行都是一串数字。长度在3——12位之间不等。现在需要算出在日志文件中数字出现次数最多的前10个。**

遇到的问题:

while(!feof(fp)){
    fgets(mid,1000,fp); //读取一行内容  
    }

我用这种方法读取文件,一直报 Segmentation fault (core dumped)。gbd调试情况如下:

需要能读取大文件的方法。求高手支招。

解决方案

你这个文件写法效率实在太低了,而且场合也不使用。超大文本文件单词频率排序是Hadoop解决的最典型问题。

这里是类似功能的源程序写法:
用C语言写Hadoop单词统计的程序

如果实在不愿意学习Hadoop,那么针对你这种情况即使不用Hadoop,直接用管道命令一样可以运行:
cat numbers.txt | ./mapper | sort | ./reducer
其中的mapper和reducer分别是原文的那两个映射器和总结器。

你如果坚持想知道怎么用文件读取这种数据,还有两种选择,其一是使用64位整数:

while(!feof(fp)) {
   long long x = 0; // 定义一个64位整型变量
   fscanf(fp, "%lld", &x);
   // .... 可以处理数据了
}

另外一种方式是用字符串:

while(!feof(fp)) {
   char mid[256]; 
   memset(mid, 0, 256);
   fscanf(fp, "%s", mid);
}

总之不要用行读取。我很好奇读完了之后你是怎么处理的?我感觉是在内存分配时崩的,难道是你打算把所有内容读到内存来处理吗?

这篇关于c++ - linux下如何用C语言读取大于10G的文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆