堆上非常大的数组(Visual C ++)

时间:2010-09-11 13:42:41

标签: c++ arrays visual-c++ visual-c++-2010

我希望有人可以帮助我,我正在尝试使用visual c ++ 2010在我的应用程序上创建一个int [400000000](4亿)数组,但它会生成溢出错误 使用g ++在linux上运行相同的代码。 我需要这个,因为我正在使用大型矩阵。 提前谢谢。

6 个答案:

答案 0 :(得分:14)

如果您使用的是32位应用程序,那么默认情况下您只有2GB的用户地址空间。 4亿个整数约为1.5GB。您很可能没有这么多连续的地址空间。可以强制32位窗口为每个进程分配3GB的用户地址空间,但这可能只是您的情况的一个停止差距。

如果你可以转向64位架构,那么这应该不是问题;否则你应该找到一种以不需要单个连续存储块的方式存储矩阵数据的方法,例如以块的形式存储它。

答案 1 :(得分:3)

我认为你需要的是一种分而治之的算法。不是内存空间。

答案 2 :(得分:1)

我不确定在你的情况下使用STXXL是否更好。

答案 3 :(得分:1)

在您的应用程序中可能使用sparse matrices。在处理具有大量0条目的大型矩阵时使用此概念,这在很多应用程序中都是如此。

顺便说一句,通过在堆上存储如此大量的数据,您无法获得任何收益。考虑一下,你的CPU缓存大概有12 MB!至少使用一些智能动态内存分配机制。

答案 4 :(得分:0)

是否真的需要分配整个阵列?你真的使用整个阵列吗?它是一个有很多0的数组吗?如果是这样的话,可以解释它在linux上运行得更好的事实。

在这种情况下,使用稀疏数组可能更合适。使用现有的稀疏数组实现可以减少内存占用,并可能允许更快的计算。

答案 5 :(得分: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;
}