如何在 C++ 中声明 10000 x 100000 大小的整数矩阵

Posted

技术标签:

【中文标题】如何在 C++ 中声明 10000 x 100000 大小的整数矩阵【英文标题】:how to declare 10000 x 100000 sized integer matrix in C++ 【发布时间】:2015-02-11 15:02:41 【问题描述】:

我需要创建一个大小为 10000x100000 的矩阵。我的内存是 4GB。它一直工作到第 25 次迭代(调试),但在第 25 次迭代后我得到一个错误“错误分配”但是只使用了 25% 的 RAM,这意味着问题与内存无关。那我该怎么办?

编辑:

int **arr;
arr=new int*[10000];
for(i=0;i<10000;i++)
    arr[i]=new int[100000];

我的分配在上面。

【问题讨论】:

在堆上分配它,你可能有 4GB 的内存,但堆栈大小只有几 MB(std::vector 非常适合) 第 25 次迭代是什么? 你是怎么分配这个的? 我在等待有人回复“谁在乎”。请张贴代码。 @Who Cares:您写道:“我从任务管理器中看到程序运行到第 25 次迭代”我想知道,您如何仅从任务管理器中确定这一点。 【参考方案1】:

如果您正在为 x64 编译,则应该没有任何问题。

如果您正在为 x86 进行编译(很可能),如果您正在使用 Visual C++,则可以启用 /LARGEADDRESSAWARE 链接器标志,或者对于其他编译器类似的东西。对于 Visual C++,该选项也可以在 IDE 的 Linker -> System -> Enable Large Addresses 属性中找到。

这会在生成的 EXE 文件中设置一个标志,告诉操作系统代码可以处理超过 2 GB 的地址。在 x64 Windows(您的情况)上运行这样的可执行文件时,操作系统会为其提供 4 GB 的地址空间来使用,而不是通常只有 2 GB。

我在我的系统上测试了您的代码,Windows 7 x64, 8 GB,使用 Visual C++ Express 2013(当然是 x86)编译并带有链接器标志,代码运行良好 - 分配了近 4 GB,没有错误。

无论如何,第 25 次迭代太快了,它不会失败,无论它在哪里运行以及它是如何编译的(大约 10 MB),所以那里还有其他问题。

顺便说一句,HEAP 链接器选项在这种情况下没有帮助,因为它不会增加最大堆大小,它只是指定最初要保留多少地址空间以及增加数量的块已提交的 RAM。简而言之,主要是为了优化目的。

【讨论】:

【参考方案2】:

一个可能的解决方案是使用您的硬盘。 只需打开一个文件并存储您需要的数据。 然后只需将所需的数据复制到缓冲区即可。 即使您可以成功地在堆上分配这么多数据 您将使用大部分时间最有可能不会使用的数据使堆超载。 最终,您可能会用完空间,这将导致性能下降或出现意外行为。 如果您担心使用硬盘驱动器会影响性能,那么考虑程序解决方案可能会适合您的问题。如果您可以在任何给定时刻生成您需要的数据而不是存储它,那么您也可以解决您的问题。

【讨论】:

【参考方案3】:

如果您使用 VS,您可能需要尝试 HEAP 链接器选项并确保您针对 x64 位目标进行编译,否则您将耗尽地址空间。物理内存的大小不应成为限制因素,因为 Windows 可以使用页面文件来提供额外的内存。 但是,从性能的角度来看,仅分配这种大小的矩阵可能是一个可怕的想法。也许您应该考虑使用备用矩阵,或者(按照 LifePhilPsyPro 的建议)按需生成数据。

【讨论】:

【参考方案4】:

为了分配非常大的缓冲区,最好使用操作系统服务将页面映射到地址空间,而不是 new/malloc。

您正在尝试分配超过 4GB 的空间。

【讨论】:

以上是关于如何在 C++ 中声明 10000 x 100000 大小的整数矩阵的主要内容,如果未能解决你的问题,请参考以下文章

在C++中,我想实现小于10000的数字到字符串的转化,而小于10000 的数字前面补0,有没有简单的方法?

C++基础二类和对象(上篇)(10000字掌握C++类核心内容)

C++基础二类和对象(上篇)(10000字掌握C++类核心内容)

C++基础二类和对象(上篇)(10000字掌握C++类核心内容)

在N(N<10000)个数里找出第k大的数,C++

计算 10000 x 10000 矩阵的互相关