0

나는 전체 다이어그램을 저장하기 위해 동적으로 할당 된 부스트 multi_array를 사용하여 3D 포인트 클라우드에서 생성 된 3D 보로 노이 다이어그램을 생성하는 애플리케이션을 개발 중입니다.큰 3D 볼륨 bad_alloc

내가 사용하고있는 테스트 케이스 중 하나가 많은 양의 메모리 ([600] [600] [600] 정도)를 필요로하며 허용 된 한계를 초과하고 bad_alloc이 발생합니다.

이미 작은 그림으로 다이어그램을 분리하려고 시도했지만 전체 메모리가 이미 한계를 초과 한 것으로 보이기 때문에 작동하지 않습니다.

제 질문은 PC 제약 조건에서 그러한 큰 3D 볼륨으로 어떻게 작업 할 수 있습니까? 요소는 3 차원 공간에서의 위치에 기초하여 상기 멀티 어레이에 인덱싱

struct Elem{ 
    int R[3]; 
    int d; 
    int label; 
} 

다음과 같이

*이 EDIT

소자 타입 구조체이다.

멀티 어레이는 파일에서 공간상의 특정 지점을 설정 한 다음 전체 공간에 걸쳐 순방향 및 역방향 마스크를 전달하여 중간 공간을 채우는 방식으로 구성됩니다.

미리 감사드립니다.

답변

0

어떻게 모든 포인트를 얻었는지 말하지 않았습니까? 파일에서 읽은 경우 모두 읽지 마십시오. 계산할 경우 필요에 따라 계산할 수 있습니다. 두 경우 모두 가장 자주 사용되는 캐시를 구현할 수 있습니다. 알고리즘에서 데이터를 사용하는 방법을 알고 있으면 다음에 필요한 값을 예측할 수 있습니다. 다른 스레드에서이 작업을 수행 할 수도 있습니다.

둘째 해결 방법은 데이터를 처리하여 RAM에 저장하는 것입니다. 216 백만 점이 있지만 포인트의 크기가 무엇인지는 알 수 없습니다. 그것들은 3D이지만 float 또는 double을 사용합니까? 클래스 또는 간단한 구조체입니까? 그들은 vtable을 가지고 있습니까? 디버그 빌드를 사용합니까? (디버그 개체에서 더 클 수 있습니다). 전체 배열을 처음부터 또는 점차적으로 할당합니까? 나는 현재의 PC에 216M의 3D 포인트를 저장하는 데 문제가 없어야한다고 생각하지만 모든 질문에 대한 답변에 달려있다.

내 생각에 떠오른 세 번째 방법은 메모리 매핑 파일을 사용하는 것입니다.하지만 개인적으로 사용한 적이 없습니다.


여기에 몇 가지 시도 할 수 있습니다 : 당신이 얻을 수있는 메모리 양을보고, * 216 일 * 216k 1K 1M * 216 :

시도처럼, 서로 다른 배치로 할당 할 수 있습니다.

부스트 맵을 std :: vector 및 raw void *로 변경하고 얻을 수있는 최대 RAM을 비교해보십시오.

0

요소 유형을 언급하지 않았습니다. 요소가 4 바이트 인 float이고, 600 * 600 * 600 매트릭스는 약 820M 바이트 만 사용하며 실제로는 그렇게 크지 않습니다. 프로세스 별 메모리 사용량에 대한 운영 체제의 제한을 확인하는 것이 좋습니다. Linux의 경우 ulimit -a으로 확인하십시오.

실제로 메모리에 매트릭스를 할당 할 수없는 경우 디스크에 원하는 크기의 파일을 만들어 메모리에 mmap을 사용하여 매핑하십시오. 그런 다음 mmap에 의해 반환 된 메모리 주소를 boost::multi_array_ref으로 전달합니다.