c++ - linux下如何用C语言读取大于10G的文件?
PHP中文网
PHP中文网 2017-04-17 15:25:39
0
3
672

需求**:

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

遇到的问题:

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

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

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

PHP中文网
PHP中文网

认证高级PHP讲师

모든 응답(3)
洪涛

이 파일을 작성하는 방식은 정말 비효율적이며 어떤 상황에서도 사용되지 않습니다. 매우 큰 텍스트 파일의 단어 빈도 정렬은 Hadoop이 해결하는 가장 일반적인 문제입니다.

유사 기능에 대한 소스 프로그램 작성 방법은 다음과 같습니다.
C 언어로 Hadoop 단어 통계 프로그램 작성

정말 Hadoop을 배우고 싶지 않다면 Hadoop을 사용하지 않더라도 파이프라인 명령으로 직접 실행할 수 있습니다.
cat numbers.txt | ./mapper | sort | ./reducer
매퍼와 리듀서는 둘입니다. 원본 텍스트의 매핑은 각각 변환기와 요약기입니다.

파일을 사용하여 이러한 종류의 데이터를 읽는 방법을 알고 싶다면 두 가지 옵션이 있습니다. 하나는 64비트 정수를 사용하는 것입니다.

으아악

또 다른 방법은 문자열을 사용하는 것입니다.

으아악

간단히 말하면 줄읽기를 사용하지 마세요. 읽으신 후 어떻게 대처하셨는지 궁금합니다. 메모리 할당 중에 충돌이 발생한 것 같습니다. 처리를 위해 모든 내용을 메모리로 읽어올 계획인가요?

洪涛

Linux C가 필요한 주요 질문에 따르면 다음과 같은 아이디어가 제공됩니다.
공유 메모리(mmap)를 사용하여 파일의 일부를 한 번에 매핑하여 순차적으로 처리하는 것을 고려할 수 있습니다. 🎜>

洪涛

분할을 사용하여 파일을 분할한 다음 정렬하는 것을 고려할 수 있습니다.

으아악
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿