为什么600MB后动态内存分配失败?

Joh*_*ohn 0 c++ bitarray bad-alloc dynamic-arrays

我使用三维char数组实现了一个bloom过滤器(位表),它运行良好,直到达到无法再分配内存并给出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;
     }
Run Code Online (Sandbox Code Playgroud)

数组的最大允许大小是多少,如果这不是问题,我该怎么办呢.

编辑:它是使用32位平台开发的.

它运行在具有8GB RAM的64位平台(服务器)上.

Han*_*ant 5

32位程序必须从虚拟内存地址空间分配内存.其中存储了大量代码和数据,内存是从它们之间的漏洞中分配的.是的,你可以希望的最大值是大约650兆字节,这是最大的可用漏洞.从那里开始迅速下降.您可以通过使数据结构更智能来解决它​​,例如树或列表而不是一个巨型数组.

您可以使用SysInternals的VMMap实用程序更深入地了解流程的虚拟内存映射.您可能能够更改DLL的基址,使其不会在地址空间的空区域中间垂直.然而,你将获得超过650 MB的可能性很小.

在64位操作系统上有更多的喘息空间,32位进程具有4千兆字节的地址空间,因为操作系统组件以64位模式运行.您必须使用/ LARGEADDRESSAWARE链接器选项才能允许进程使用它.尽管如此,这只适用于64位操作系统,您的程序仍然可能在32位操作系统上爆炸.当你真的需要那么多虚拟机时,最简单的方法就是将64位操作系统作为先决条件,并构建针对x64的程序.