需求**:
有一个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排序: