我使用三维char数组实现了一个布隆过滤器(位表),它运行良好,直到它达到不能再分配内存并给出消息的一个点为止。分配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位平台开发的。
它运行在具有8GB RAM的64位平台(服务器)上。
此代码甚至伤害眼睛,毫无疑问,它不起作用。 – 2012-04-28 17:03:45
640MB应该足够每个人。哎呀,我是否大声说出来?我的意思是,你有多少内存,这是一个64位的环境? – 2012-04-28 17:04:24
您使用的是什么系统?你不能指望一个32位系统有一个大小为6GB的数组[因为有4GB的虚拟地址,如果我没有记错的话,其中约1GB是保留给内核的,至少在linux下] – amit 2012-04-28 17:04:28