代码之家  ›  专栏  ›  技术社区  ›  joseph

为什么创建一个比我的内存大的1D数组会失败,但我创建一个比我的内存大的2D数组没有问题?

  •  2
  • joseph  · 技术社区  · 8 年前

    为什么创建一个比我的内存大的一维数组会失败,但我可以创建一个比我的内存大的二维数组?我以为操作系统会给你虚拟内存,你可以要求任何你想要的。直到你开始对内存进行读写,并且它成为驻留集的一部分,硬件约束才成为一个问题。

    在带有 512MB 我试过的记忆:

    1, 512 MB array: no issue
    1, 768 MB array: no issue
    1, 879 MB array: no issue
    1, 880 MB array: fails
    1, 1024 MB array: fails
    1000, 512MB arrays no issue (at this point
        I've allocated 256GB of virtual memory,
        well exceeding the physical limits)
    

    在具有 8GB 在记忆方面,上述所有方法都有效。

    在这个实验中,我使用了以下代码:

    #include <stdio.h>      /* printf */
    #include <stdlib.h>     /* atoi */
    #include <iostream>
    #include <unistd.h>
    
    int main(int argc, char *argv[],char **envp) {
        if(argc < 3) {
            printf("main <mb> <times>\n");
            return -1;
        }
    
        int megabytes = atoi(argv[1]);
        int times = atoi(argv[1]);
    
        // megabytes    1024 kilobytes      1024 bytes          1 integer
        // --------   * ---------        *  ----------    *     --------
        //              megabyte            kilobyte            4 bytes
        int sizeOfArray = megabytes*1024*1024/sizeof(int);
        long long bytes = megabytes*1024*1024;
        printf("grabbing memory :%dmb, arrayEntrySize:%d, times:%d bytes:%lld\n",
                        megabytes, sizeOfArray, times, bytes);
    
        int ** array = new int*[times];
        for( int i = 0; i < times; i++) {
            array[i] = new int[sizeOfArray];
        }
    
        while(true) {
            // 1 second to microseconds
            usleep(1*1000000);
        }
    
        for( int i = 0; i < times; i++) {
            delete [] array[i];
        }
        delete [] array;
    }
    

    小型计算机实验的指令和输出 512MB 虚拟机:

    free -h
                  total        used        free      shared  buff/cache   available
    Mem:           488M         66M         17M        5.6M        404M        381M
    Swap:          511M         72K        511M
    
    ./a.out 512 1
    grabbing memory :512mb, arrayEntrySize:134217728, times:512 bytes:536870912
    ./a.out 768 1
    grabbing memory :768mb, arrayEntrySize:201326592, times:768 bytes:805306368
    
    ./a.out 1024 1
    grabbing memory :1024mb, arrayEntrySize:268435456, times:1024 bytes:1073741824
    terminate called after throwing an instance of 'std::bad_alloc'
      what():  std::bad_alloc
    Aborted (core dumped)
    
    ./a.out 512 1000
    grabbing memory :512mb, arrayEntrySize:134217728, times:512 bytes:536870912
    #htop
      PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
     2768 root      20   0  256G  4912  2764 S  0.0  1.0  0:00.00 ./a.out 512 1000
    

    大型计算机实验的命令和输出 8GB 虚拟机:

    free -h
                  total        used        free      shared      buff/cache   available
    Mem:           7.8G         78M        7.6G        8.8M        159M        7.5G
    Swap:          511M          0B        511M
    
    ./a.out 512 1
    grabbing memory :512mb, arrayEntrySize:134217728, times:512 bytes:536870912
    ./a.out 768 1
    grabbing memory :768mb, arrayEntrySize:201326592, times:768 bytes:805306368
    ./a.out 1024 1
    grabbing memory :1024mb, arrayEntrySize:268435456, times:1024 bytes:1073741824
    ./a.out 512 1000 
    grabbing memory :512mb, arrayEntrySize:134217728, times:512 bytes:536870912
    # htop
      PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
     1292 root      20   0  256G  6920  2720 S  0.0  0.1  0:00.00 ./a.out 512 1000
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   lordseanington    8 年前

    这是因为内存是根据你的请求分配的。

    你要的是2D数组中一系列相对较小的块,每个块不一定相邻。

    然而,1D阵列是巨大的,需要一个完整大小的连续内存块,即使有太多可用内存,也可能没有这样大小的内存块可用。