2011-11-28 2 views
1

저는 MPI를 사용하여 수퍼 컴퓨터로 작업하고 있습니다. 하지만 문제의 .. C++ 데이터의 파일이 "긴 숫자"의 50 수백만 달러를 포함 vector<long>v1MPI 사용 : C++ std :: bad_alloc

//open file 
    ... 
    vector<long>v1; 

    while (!f1.eof()){ 
     //input data into 
     v1.push_back(s1); 
    } 

좋아요로 읽어 데이터 파일 열기와 프로그램을 가지고, 그것은 완벽했다.

std::bad_alloc(); 

방법이 개선 : 데이터 파일이 "긴 숫자"75 백만 이상 포함 된 경우 하지만, 그것은 예외와 함께 실패? 나는 (전혀) 슈퍼 컴퓨터에 많은 경험을 가지고 있지 않지만

이 외에,

답변

4

벡터를 사용하지 마십시오. 벡터는 모든 요소가 연속적인 메모리 위치에 적합하도록 요구하며 매우 큰 콜렉션에는 적합하지 않습니다. 사용할 올바른 데이터 구조는 액세스 패턴에 따라 달라 지지만 list이 작동하지만 많은 메모리를 낭비합니다 (각 long 저장할 두 개의 포인터). 아마도 long을 100 개 정도의 그룹으로 나누고 해당 그룹의 링크 된 목록을 만들고 싶을 것입니다. 다시 말하지만 올바른 대답은 실제 외부 문제에 달려 있습니다.

+2

'deque'는 벡터에 가깝지만, 단편적인 저장소가있다. (분명히이 단편화를 제어하는 ​​것은 표준 제어를 넘어서는 것입니다.) – GManNickG

+0

@GMan 시도해 보는 것이 좋습니다. 어떻게 작동되는지는 STL의 'deque'구현이 '좋은'(자신의 특정 문제에 대한) 방법에 달려 있습니다. 대부분 그의 문제를 해결할 것입니다. –

1

(100 이상) 많은 프로세서를 사용, 난 당신에게 그 표준을 알 수 있습니다 : 당신이 시스템에서 실행할 때 bad_alloc 뿐이다 만 발생한다 자원.

이 경우 컴퓨터가 힙에 부과하는 제한에 도달했을 가능성이 있습니다 (운영 체제 관점 또는 물리적 관점 (최종적으로 같은 종류의 것)) 벡터가 동적으로 발생하기 때문에 가능성이 있습니다 힙에 요소를 할당합니다.

top 또는 유사한 명령을 사용하여 리소스 사용을 모니터링하고 실제로 사용중인 시스템 설정과 시스템 설정을 확인할 수 있습니다.

또 다른 참고 사항 - 대략 사용하는 요소의 수를 알고있는 경우 벡터를 만들고 reserve()를 호출해야 효율성이 크게 향상됩니다.

+0

해결 방법은 분할 된 컨테이너로 전환하는 것입니다. 첫 번째 선택은 'deque'이므로 메모리를 조각으로 할당 할 수 있습니다. 즉, 이것은 (명백하게) 인접한 스토리지에 의존하는 모든 것을 무너 뜨립니다. – GManNickG

+0

나는 그 점에 동의 할 것이다. 내가 생각하기에 그렇게 멀리 생각하지 않았기 때문에 대답으로 던져라. –

관련 문제