2010-01-18 15 views
0

속도와 효율성을 고려하여 C++에서 대형 텍스트 (5MB 이상) 파일을 읽는 가장 좋은 방법은 무엇인지 알아 내려고합니다. 어떤 선호되는 클래스 또는 함수를 사용해야하며 그 이유는 무엇입니까?텍스트 파일 읽기

그건 그렇고, 나는 UNIX 환경에서 구체적으로 실행 중이다.

+0

OS를 구체적으로 지정해야하므로 OS를 구체적으로 지정해야한다고 생각합니다. 예 : Windows는 메모리 매핑 파일을 허용합니다. –

+0

답변은 또한 텍스트로 수행하려는 작업에 따라 달라집니다. 유닉스에는 메모리 매핑 파일도있다. – Omnifarious

+0

숙제를하지 않거나 C++이 필요한 프로젝트를하고 있다면 Linux에서 파일을 읽는 도구 (C/C++로 작성), grep, awk 등을 다시 작성하지 마십시오. C/C++에서이 작업을 원한다면 소스를 확인하고 완료된 방법을 확인할 수 있습니다. – ghostdog74

답변

0

스트림 클래스 (ifstream)는 실제로 훌륭하게 작동합니다. 그렇지 않다면 ios_base : :)에서 sync_with_stdio를 해제하십시오. getline()을 사용하여 std :: strings로 직접 읽을 수 있지만 고정 버퍼를 char * (구식 벡터 또는 old-school char [])로 사용하는 성능 관점에서 더 빠를 수 있습니다 (위험/복잡성이 더 높음).).

페이지 크기 계산 등으로 게임을 즐기려는 경우 mmap 경로를 사용할 수 있습니다. 스트림 클래스를 사용하여 먼저 빌드하고 충분히 좋은지 확인하십시오.

각 데이터 라인에서 수행중인 작업에 따라 처리 루틴이 I/O가 아니라 최적화 포인트임을 알기 시작할 수 있습니다.

+0

ifstreams의 경우 fread()보다 어떤 이점이 있습니까? – jasonline

+0

성능면에서 볼 때, 나는 거의 같을 것이라고 기대한다. 코드 유지 보수 측면에서 볼 때 스트림 클래스를 다루는 편이 낫습니다. – Joe

0

이전 스타일의 파일 io를 사용하십시오. 당신은 정수, 수레와 작은 문자열을 저장하는 텍스트 파일을 사용하는 경우

fopen the file for binary read 
fseek to the end of the file 
ftell to find out how many bytes are in the file. 
malloc a chunk of memory to hold all of the bytes + 1 
set the extra byte at the end of the buffer to NUL. 
fread the entire file into memory. 
create a vector of const char * 
push_back the address of the first byte into the vector. 
repeatedly 
    strstr - search the memory block for the carriage control character(s). 
    put a NUL at the found position 
    move past the carriage control characters 
    push_back that address into the vector 
until all of the text in the buffer has been processed. 

---------------- 
use the vector to find the strings, 
and process as needed. 
when done, delete the memory block 
and the vector should self-destruct. 
+0

스트림 클래스보다 어떻게 더 좋은가요? – jasonline

+0

이전 스타일의 파일 io는 스트림과 동형입니다. 어느 쪽이든 할 수 있습니다. 전체 파일을 한꺼번에 버리고 중요한 문자열을 파싱합니다. – EvilTeach

0

, 내 경험 FILEfopenfscanf 충분히 빠르게 이미도 직접 숫자를 얻을 수 있다는 것입니다. 나는 메모리 매핑이 가장 빠르다고 생각하지만, 파일을 파싱하는 코드를 작성해야한다. 추가 작업이 필요하다.