【问题标题】:Program consuming too much RAM [closed]程序消耗太多 RAM [关闭]
【发布时间】:2017-04-01 15:52:10
【问题描述】:

我正在尝试运行一个简单的代码来创建一个二维数组。起初我正常声明了数组,但它异常终止。

在任务管理器中,程序通常会增长到 0.4 MB 的大小并被终止。所以,经过一番研究,我发现了堆,因此试图存储在那里。这次它占用了将近 3 GB,并且由于内存不足而重新启动了我的操作系统。

int main()
{
    for(int i=0;i<1000;i++)            // outer loop to create 1000 instances
    {
        int** c = new int*[3000];         // creating 2D array of size 3000*3000
        int** b = new int*[3000];

        for(int z=0;z<3000;z++)
        {
            c[z] = new int[3000];
            b[z] = new int[3000];
        }

    }
    return 0;
}

所以,据我所知,c 的最大大小是 [3000][3000] = 36*10^6 B = 36 MB

现在我有 4GB 的 RAM,所以这似乎很不公平。

无论如何,我知道 C++ 没有自动垃圾收集;这就是遗体被排除在外的原因。但是,我需要这个数组结构来进行计算。我怎样才能让它使用更多的可用内存?

【问题讨论】:

  • 对不起,我是认真的。刚刚写错了!
  • for(int z=0;z&lt;k;z++) k 是什么?
  • 请去掉C标签,因为这与C无关。你需要的内存实际上是2 * 3000 * 3000 * z * n * sizeof(int),肯定比36MB多。
  • 如果你想把内存放回去重用,为什么不delete呢?
  • @FREE_AND_OPEN_SOURCE 不要理解你。

标签: c++ memory-management


【解决方案1】:

您似乎对new 的工作原理(以及如何使用它)有错误的想法。基本上,您的代码分配了超过 3000 x 3000 个整数。

除此之外,我建议将二维数组折叠成一维数组。我还建议改用std::vector&lt;int&gt;)。

如果您打算自己分配内存,但您可以使用:

int* array = new int[3000 * 3000];

然后最终调用delete 释放内存,如下所示:

delete[] array;

这是一个例子:

int main()
{
    int* array = new int[3000 * 3000];
    // assume that array now points to un-initialized memory
    // i.e. don't assume any array element has any particular value
    //    until you set the value of the element.

    for (int i = 0; i < 3000; ++i)
    {
        for (int j = 0; j < 3000; ++j)
        {
             // To store a value...
             int yourvalue = i * 3000 + j; // or whatever value it is you want to store
             array[i * 3000 + j] = yourvalue;

             // Or to read a value...
             yourvalue = array[i * 3000 + j];
        }
    }
    delete [] array;
}

希望这能回答您关于如何创建和使用 3000 x 3000 大小的内存缓冲区而不消耗太多内存的问题。当然,这假设您的系统至少有 3000 * 3000 * sizeof(int) 的内存空间。其中,如果 sizeof(int) == 4(它经常这样做),大约是 36MB。

【讨论】:

  • 哇!这很酷。我想这会救我。 :) 谢谢!
【解决方案2】:

你有2 * sum{ 0 ~ 2999 } = 2 * 2999 * 3000 / 2 = 8,997,000int*s,每个int*指向int[3000]

如果假设sizeof(int*) == 8sizeof(int) == 4,你的程序需要的内存大小是8997000 * (8 + 3000 * 4) = 108,035,976,000字节。

108,035,976,000 字节 > 105,503,882 KiB > 103,031 MiB > 100 GiB。我认为您的机器不支持 100 GiB 大小的内存空间。

【讨论】:

  • 很好。你能告诉我如何创建 1000 次 3000*3000 数组吗?
  • 如果一次只需要一个 3000x3000 的数组,就只做 1 个,然后反复使用。
  • 尝试删除阵列,因为您一次只需要一个。重用内存而不是分配它。
  • @Milind 谢谢,正在努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2021-07-26
  • 2020-04-16
相关资源
最近更新 更多