2016-08-26 2 views
-1

저는 약간의 속도를 얻기 위해 이전 R 코드를 C++로 재현하려고합니다. 이 코드는 미리로드 된 데이터 (13689 x 126 크기의 6 개 행렬)를 사용해야합니다 (각 파일의 크기는 .txt 파일에서 약 28MB입니다). R이 이것을 메모리에로드하는 데 아무런 문제가 없었습니다.C++에서 'large'데이터 파일을 읽으십시오.

나는 C++ 코드 (C++을 처음 사용함)를 만들었는데,이 데이터를 미리로드하려고합니다. (어쨌든 헤더 파일 btw에 미리로드 할 것입니까?). 내가 파일 (인텔 컴포저를 사용)를 컴파일 할 수 있습니다,하지만 난 한 .exe를 시작할 때, 그것은 즉시 충돌 : 더블 또는 배열을 사용하여

int i, j; 
const int length_grid1 = 13689; 
const int length_grid_pl = 126; 

ifstream in; 
//double M1_BETA[length_grid1][length_grid_pl]; // either this, or the other one 
std::array<std::array<int, length_grid_pl>, length_grid1> M1_BETA; 
in.open("preloaded_object/M1_BETA.txt"); 
for (i = 0; i < length_grid1; i++) { 
    for (j = 0; j < length_grid_pl; j++) { 
     in >> M1_BETA[i][j]; 
    } 
} 
in.close(); 

두 버전은 작동하지 않습니다. 이것은로드 된 행렬 중 하나에서만 발생합니다 ... 그리고 그 중 6 개를로드해야합니다.

내 코드에서 문제가 없다고 생각합니다. 아무 문제없이 스스로 실행하는 데이터 차원을 줄이면됩니다.
모든 프로그램이로드되지 않으면 나중에 프로그램을 실행할 수 없습니다. 그리고 부품을 부분별로 다시로드하면 속도가 너무 느려져서 계산 속도가 빨라집니다 (그리고 C++로 바꿨습니다).

28MB가 너무 많아 프로그램이 충돌하나요? R이 예를 들어 어떤 문제도 없기 때문에 이상하게 보입니다 ...

그렇지 않으면 메모리에 저장되는 공간이 적어 지도록 미리로드 할 수 있습니까? 나중에 데이터 행을 쉽게 액세스 할 수 있어야합니다 (셀별로 셀이 중요하지 않으므로 필요한 행을 실제로 빠르게 액세스하는 것이 필요합니다).

또는 C++에서 언제든지 사용할 수있는 데이터를 저장하는 다른 방법이 있습니까?

미리 감사드립니다.

+1

'std :: array , length_grid1> M1_BETA;는 일반적으로 스택에서 인스턴스화됩니다. 이는 대부분의 환경에서 사용할 수있는 스택에 비해 너무 큽니다. –

+3

대용량 데이터는'std :: vector'를 사용해야합니다. – NathanOliver

+0

std :: vector와 함께 작동합니다. 실제로 고마워요! 배열과의 차이점은 무엇입니까? –

답변

관련 문제