【问题标题】:Very large array on the heap (Visual C++)堆上非常大的数组(Visual C++)
【发布时间】:2011-04-11 02:38:27
【问题描述】:

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

【问题讨论】:

  • 您是否尝试动态创建它?
  • 也许如果您分享您要解决的核心问题,我们将能够提供更多帮助。
  • 在某些系统上,堆栈帧的大小有限制。你可能会遇到这个。使用 std::vector 看看这是否解决了问题(否则你只是内存不足。

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


【解决方案1】:

我刚刚找到了一个非常简单的解决方案,但我不知道它是否可取

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;
}

【讨论】:

  • 您的解决方案是尽早抢占地址空间。不要依赖这个在 32 位上处理这么大的块,它对环境很脆弱。
【解决方案2】:

也许sparse matrices 在您的应用程序中有用。在处理具有大量 0 条目的大型矩阵时会使用此概念,在很多应用程序中都可能出现这种情况。

顺便说一句,在堆上存储如此大量的数据并没有任何好处。考虑一下,您的 CPU 缓存可能有 12 MB!至少使用一些智能的动态内存分配机制。

【讨论】:

    【解决方案3】:

    我认为您需要的是分治算法。不是内存空间。

    【讨论】:

    • 这没有帮助
    【解决方案4】:

    真的需要分配整个数组吗?你真的使用整个数组吗?它是一个包含很多 0 的数组吗?如果是这样,那么它在linux上运行得更好的事实就可以解释了。

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

    【讨论】:

      【解决方案5】:

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

      如果您可以迁移到 64 位架构,那么这应该不是问题;否则,您应该找到一种不需要单个连续存储块的方式存储矩阵数据的方法,例如将其存储在块中。

      【讨论】:

      • +1,是的。 650 MB 几乎是您所能期待的。将矩阵存储在更智能的数据结构中对于速度也非常很重要。
      • 速度取决于您的访问模式。对于数据的直线传递,操作系统分页旧页面和手动缓存策略之间的区别可能没有什么。如果(例如!)您要在 20000 x 20000 矩阵上执行矩阵乘法,则很难想出一个快速的策略,因为您需要以所有组合方式组合来自矩阵所有区域的数字。
      • @Charles:没有那么困难。只需要使用阻塞:)
      • @jalf:我很清楚,在这种情况下,您所说的“阻止”是什么意思?
      • @Charles: netlib.org/utk/papers/autoblock/node2.html 例如 - 基本上将矩阵拆分为更小的块(大小以适合缓存或主内存),并在交换之前尽可能多地在单个块上做工作下一个。一种在矩阵乘法等算法上获得更好缓存行为的常用方法
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-14
        • 2014-01-31
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 2011-01-29
        • 2010-09-17
        相关资源
        最近更新 更多