블룸 필터 (비트 테이블) 3 차원 char 배열을 사용하여 더 이상 메모리를 할당 할 수있는 지점에 도달 할 때까지 작동하고 bad_alloc 메시지를 제공합니다. 600MB를 할당 한 후 다음 확장 요청시이 오류가 발생합니다.왜 동적 메모리 할당이 600MB 후에 실패합니까?
블룸 필터 (배열)는 8-10GB로 커질 것으로 예상됩니다.
다음은 비트 테이블을 할당 (확장)하는 데 사용되는 코드입니다.
unsigned char ***bit_table_=0;
unsigned int ROWS_old=5;
unsigned int EXPND_SIZE=5;
void expand_bit_table()
{
FILE *temp;
temp=fopen("chunk_temp","w+b");
//copy old content
for(int i=0;i<ROWS_old;++i)
for(int j=0;j<ROWS;++j)
fwrite(bit_table_[i][j],COLUMNS,1,temp);
fclose(temp);
//delete old table
chunk_delete_bit_table();
//create expanded bit table ==> add EXP_SIZE more rows
bit_table_=new unsigned char**[ROWS_old+EXPND_SIZE];
for(int i=0;i<ROWS_old+EXPND_SIZE;++i)
{
bit_table_[i]=new unsigned char*[ROWS];
for(int k=0;k<ROWS;++k)
bit_table_[i][k]=new unsigned char[COLUMNS];
}
//copy back old content
temp=fopen("chunk_temp","r+b");
for(int i=0;i<ROWS_old;++i)
{
fread(bit_table_[i],COLUMNS*ROWS,1,temp);
}
fclose(temp);
//set remaining content of bit_table_to 0
for(int i=ROWS_old;i<ROWS_old+EXPND_SIZE;++i)
for(int j=0;j<ROWS;++j)
for(int k=0;k<COLUMNS;++k)
bit_table_[i][j][k]=0;
ROWS_old+=EXPND_SIZE;
}
어레이의 최대 허용 크기는 무엇이며, 이것이 문제가 아닌 경우 무엇을 할 수 있습니까?
편집 : 32 비트 플랫폼을 사용하여 개발되었습니다.
8 비트 RAM이 장착 된 64 비트 플랫폼 (서버)에서 실행됩니다.
이 코드는 눈을 아프게합니다. 틀림없이 작동하지 않습니다. –
640MB는 모두에게 충분해야합니다. 죄송합니다, 나는 그것을 크게 외쳤습니까? 나는 얼마나 많은 기억을 가지고 있으며 이것은 64 비트 환경인가? –
어떤 시스템을 사용하고 있습니까? 32 비트 시스템에 6GB 크기의 배열이있을 것으로 기대할 수 없습니다. [4GB 가상 주소가 있기 때문에 올바르게 기억한다면 약 1GB가 커널 용으로 예약되어 있습니다] 적어도 – amit