2012-01-21 4 views
-1

나는 C++ 컴파일러가 제한을 두지 않는 다른 대답을 읽었습니다. maximum size of std::vector. 하나의 목적으로 벡터를 사용하려고하는데 10^19 개의 항목이 필요합니다.stl "벡터 <T> 너무 깁니다"

typedef struct{ 
    unsigned long price, weight; 
}product; 


//inside main 
unsigned long long n = 930033404565174954; 
vector<product> psorted(n); 

마지막 문장에서 프로그램이 중단됩니다. 내가 대신 메시지 n 다음 또한 프로그램 중단과 초기화의 resize(n)을 시도하는 경우 :

vector<T> too long 
std::length_error at memory location 

을 내가 벡터에서 퍼팅 후 가격을 accourding 데이터를 정렬해야합니다. 나는 어떻게해야합니까?

+8

C++에서 typedef struct를 사용하는 이유는 무엇입니까? 아마도 누군가가 할 수있는 많은 것을 배우고 있습니까? :-) –

+4

930033404565174954는 10^9보다 훨씬 큽니다. –

+1

'sizeof (std :: vector :: size_type)'을 확인하십시오. 그것은 당신에게 최대 크기를 알려줍니다. –

답변

11

std::vector에는 수행 할 수있는 물건의 양이 제한되어 있습니다. 사용할 수있는 최대 크기를 반환하는 std::vector::max_size으로 쿼리 할 수 ​​있습니다.

10^19 항목입니다.

10^19 * sizeof(product) 메모리가 있습니까? 나는 당신이 ~ 138 Exa 바이트 RAM이 없다고 생각합니다. 또한, 64 비트 모드로 컴파일해야만 할당을 고려해야합니다. 컴파일러는 깨지지 않습니다. 당신의 실행은 너무 많은 것을 할당하려고 시도 할 때 끊어지고 있습니다.

+0

그러면 데이터를 어떻게 정렬해야합니까? – Pheonix

+2

@Pheonix :이 데이터를 정렬하는 방법에 대해 질문하는 경우 RAM보다 데이터가 명확하기 때문에 가져 오는 위치를 설명해야합니다. 질문의 제목이 오해의 소지가 있습니다. –

+0

hadoop에서 신원 맵 축소가 가능합니다. 단일 상자에서도 가능한 한 정렬을 병렬 처리하여 잠재적으로 정렬 속도를 향상시킵니다. –

6

다른 사람들은 이미 문제가 무엇인지 말해주었습니다. 한 가지 가능한 솔루션은 방대한 양의 메모리 부족 데이터 세트를 위해 설계된 STL 구현 인 STXXL 라이브러리를 사용하는 것입니다.

그러나 10^19 8 바이트 항목은 8 천만 TB입니다. 누구도 큰 디스크를 가지고 있는지 확신하지 못합니다 ...

또한 300MB/s의 충분한 디스크 대역폭을 가정하면 쓰기에는 8000 년이 걸릴 것입니다!