我希望有人可以帮助我,我正在尝试使用 Visual c++ 2010 在我的应用程序上创建一个 int[400000000](4 亿)数组,但它会产生溢出错误相同的代码在使用 g++ 的 linux 上运行。我需要这个,因为我正在处理大型矩阵。先感谢您。
问问题
3195 次
6 回答
14
如果您使用的是 32 位应用程序,那么默认情况下您只有 2GB 的用户地址空间。4亿个整数大约是1.5GB。您很可能没有这么多连续的地址空间。可以强制 32 位窗口为每个进程分配 3GB 的用户地址空间,但这可能只是您的情况的权宜之计。
如果您可以迁移到 64 位架构,那么这应该不是问题;否则,您应该找到一种不需要单个连续存储块的方式存储矩阵数据的方法,例如将其存储在块中。
于 2010-09-11T13:49:39.237 回答
3
我认为您需要的是分而治之的算法。不是内存空间。
于 2010-09-11T14:02:42.583 回答
1
我不确定在您的情况下,使用STXXL是否会更好。
于 2010-09-11T13:48:14.307 回答
1
也许稀疏矩阵在您的应用程序中有用。在处理具有大量 0 条目的大矩阵时使用此概念,在很多应用程序中都可能出现这种情况。
顺便说一句,在堆上存储如此大量的数据并没有任何好处。考虑一下,您的 CPU 缓存可能有 12 MB!至少使用一些智能的动态内存分配机制。
于 2010-09-11T14:17:25.943 回答
0
整个数组真的需要分配吗?你真的使用整个数组吗?它是一个包含很多 0 的数组吗?如果是这样,那么可以解释它在 linux 上工作得更好的事实。
在这种情况下,使用稀疏数组可能更合适。使用现有的稀疏数组实现将减少内存占用并可能允许更快的计算。
于 2010-09-11T14:02:18.903 回答
0
我刚刚找到了一个非常简单的解决方案,但我不知道它是否可取
int tab[400000000]={0};//global array
int main(array<System::String ^> ^args)
{
std::cout<<tab[399999999]<<std::endl;//ok
/*
int* tab=new int[400000000];//doesn't work
...
delete[] tab;
*/
return 0;
}
于 2010-09-14T13:00:00.153 回答