2016-11-20 5 views
0

크기가 9GB 인 .txt 파일이 있다고 가정합니다. 그리고 MB의 n 번째 읽기만하고 싶습니다. (나는 무엇이 n인지를 안다). 하지만 내 컴퓨터에는 4GB의 RAM 만 있으므로 모든 파일을 한 번에로드 할 수 없습니다. 다른 n 번을 여러 번 액세스해야합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까 (standart ifstream이이 작업을 수행 할 수 있는지 여부는 알 수 없습니다).C에서 큰 파일 읽기

답변

1

파일에서 지정된 위치로 "검색"하고 싶습니다. http://www.cplusplus.com/reference/istream/istream/seekg/

예를 들면 :

char data[1024*1024]; 
ifstream in("myfile.txt"); 
in.seekg(450 * 1024 * 1024, ios_base::beg); // skip 450 MB 
if (in.read(data, sizeof(data)) { 
    // use data 
} 
+0

그냥 문자 데이터 [1024 * 1024]'스택에 1MB의 할당합니다 것은 문제가에 따라 포즈 수있는'기억하여 스택 크기. 할당량을 늘리려면 힙을 사용하는 것이 좋습니다. 이를 행하려면'char * data = new char [1024 * 1024]'행으로 변경하십시오. –

+1

@JosipVujcic : 당신이'새'를 사용할 때까지 나는 너와 함께했다. C++ 14에서는'make_unique (1024 * 1024)'를 사용할 수 있습니다. C++ 98'std :: vector 데이터 (1024 * 1024)'. –

+0

나는 가능한 문제를 지적하고 간단한 해결책을 제시하고자했다. 스마트 포인터 (C++ 14)를 사용하는 것이 최선의 방법이라고 동의합니다. –

0

당신의 OS가 64 비트 C++에서 당신이 seekg()를 사용 ifstream를 사용하고 계십니까? 그렇다면 mmap()을 시도해보십시오.

최신 운영 체제에서는 파일을 메모리 영역에 mmap ( 발음 "em-map") 할 수 있습니다. 이 작업이 끝나면 파일 에 프로그램의 배열처럼 액세스 할 수 있습니다.

프로그램에서 실제로 액세스하는 파일의 영역 만로드되므로 읽기 또는 쓰기보다 더 효율적입니다. mmapped 영역의 로드되지 않은 부분에 대한 액세스는 스왑 아웃 된 페이지와 마찬가지로 과 같은 방식으로 처리됩니다.

메모리가 부족한 경우 mmaped 페이지를 다시 파일로 저장할 수 있기 때문에 실제 메모리와 스왑 공간보다 파일 크기가 큰 인 mmap을 가능하게 할 수 있습니다. 유일한 제한은 주소 공간입니다. 이론적 인 한계는 32 비트 시스템에서 4GB입니다 ( ). 그러나 일부 영역은 이 다른 용도로 예약되어 있기 때문에 실제 한계가 더 작습니다. LFS 인터페이스를 사용하는 경우, 파일 크기가 이고 32 비트 시스템에서는 2GB로만 제한되지 않습니다 (오프셋이 서명되어 은 4GB의 주소 지정 가능 영역을 절반으로 줄임). 전체 64 비트는 입니다.

메모리 매핑은 메모리의 전체 페이지에서만 작동합니다. 따라서 매핑을위한 주소 은 페이지 정렬되어야하며 길이 값은 반올림되어 입니다.

더 많은 정보는 :