【发布时间】:2012-05-09 02:07:18
【问题描述】:
我使用三维 char 数组实现了一个布隆过滤器(位表),它运行良好,直到它无法再分配内存并给出 bad_alloc 消息。它在分配 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 位平台(服务器)上。
【问题讨论】:
-
这段代码连眼睛都疼,肯定不行。
-
640MB 对于每个人来说应该足够了。哎呀,我大声说出来了吗?我的意思是,你有多少内存,这是 64 位环境吗?
-
你用的是什么系统?你不能指望一个 32 位系统有一个大小为 6GB 的数组 [因为有 4GB 虚拟地址,如果我没记错的话,其中大约 1GB 是为内核保留的,至少在 linux 上]
-
你们在哭什么?代码并没有那么糟糕,它非常简单且切中要害。并非所有内容都需要分布在六个不同文件中的一百个函数中。这就是生产代码的样子。
-
@MahmoudAl-Qudsi:我见过看起来不像这样的生产代码。但我也认为没有理由不尝试编写更好的代码。说“这就是真实世界代码的样子”只是意味着我们甚至不应该尝试来编写更好的代码。这是荒谬的。我们当然应该。但话虽如此,这显然是 C,而不是 C++。而且随着 C 代码的发展,我认为这并不是特别糟糕。如果我们称它为 C++ 代码,那将是可怕。但除了 C++ 标签,我认为没有理由相信它是 C++。
标签: c++ dynamic-arrays bitarray bad-alloc