84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
需求**:
有一个15G左右的日志文件,文件中每一行都是一串数字。长度在3——12位之间不等。现在需要算出在日志文件中数字出现次数最多的前10个。**
遇到的问题:
while(!feof(fp)){ fgets(mid,1000,fp); //读取一行内容 }
我用这种方法读取文件,一直报 Segmentation fault (core dumped)。gbd调试情况如下:
需要能读取大文件的方法。求高手支招。
认证高级PHP讲师
你这个文件写法效率实在太低了,而且场合也不使用。超大文本文件单词频率排序是Hadoop解决的最典型问题。
这里是类似功能的源程序写法:用C语言写Hadoop单词统计的程序
如果实在不愿意学习Hadoop,那么针对你这种情况即使不用Hadoop,直接用管道命令一样可以运行:cat numbers.txt | ./mapper | sort | ./reducer其中的mapper和reducer分别是原文的那两个映射器和总结器。
cat numbers.txt | ./mapper | sort | ./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); }
总之不要用行读取。我很好奇读完了之后你是怎么处理的?我感觉是在内存分配时崩的,难道是你打算把所有内容读到内存来处理吗?
按撸主的题目要求Linux+C,提供一种思路,如下:可以考虑使用共享内存(mmap),每次映射文件的一部分,依次处理即可
可以考虑用split分割文件,然后sort排序:
#large.txt文件每100行进行分割,分割后文件前缀为prefix_ split -l 100 large.txt prefix_ #对文件里的行按数字逆序排序 sort -rn prefix_ab
你这个文件写法效率实在太低了,而且场合也不使用。超大文本文件单词频率排序是Hadoop解决的最典型问题。
这里是类似功能的源程序写法:
用C语言写Hadoop单词统计的程序
如果实在不愿意学习Hadoop,那么针对你这种情况即使不用Hadoop,直接用管道命令一样可以运行:
cat numbers.txt | ./mapper | sort | ./reducer
其中的mapper和reducer分别是原文的那两个映射器和总结器。
你如果坚持想知道怎么用文件读取这种数据,还有两种选择,其一是使用64位整数:
另外一种方式是用字符串:
总之不要用行读取。我很好奇读完了之后你是怎么处理的?我感觉是在内存分配时崩的,难道是你打算把所有内容读到内存来处理吗?
按撸主的题目要求Linux+C,提供一种思路,如下:
可以考虑使用共享内存(mmap),每次映射文件的一部分,依次处理即可
可以考虑用split分割文件,然后sort排序: