【问题标题】:Compliler out of heap size for large array编译器超出大数组的堆大小
【发布时间】:2020-09-05 05:15:52
【问题描述】:

所以我有一个包含 15,000,000 个元素的双精度数组,在运行期间,需要从数组中提取 2000 个元素的随机子集进行处理。

我尝试使用以下方法初始化数组:

static const double myArray[15000000] = {-2.1232, -6.4243, 23.432, ...};

但是在运行时我收到错误“C1060 编译器堆空间不足”。在 Visual Studio 2019 中,我进入了项目属性 -> 链接器 -> 系统并将堆保留大小修改为“8000000000”,我认为它足够大,我的机器上有 16GB,但我仍然返回相同错误。我也尝试过使用 x64 编译器,但无济于事。

我还尝试将数组写入 csv,然后在运行时读取二进制文件并从中读取。但是,读取过程需要的时间太长,因为我需要读取它,理想情况下,每秒读取几次。

我对 C++ 比较陌生,但在内存分配方面尤其新。您有什么建议作为解决方案?

【问题讨论】:

  • 为什么不从文件中加载数组?
  • 你为什么要硬编码这样数量惊人的值?通常这是在运行时从文件中读取到std::vector。成本应该是无关紧要的。
  • 这听起来像是编译器在尝试编译应用程序时内存不足。可能与巨大的阵列有关。
  • 使用指针而不是数组。动态分配数组。将二进制文件加载到其中。

标签: c++ arrays memory heap-memory allocation


【解决方案1】:

如果您有二进制格式的 15M 双打,您可以embed that into your binary 并引用它。首次加载二进制文件时,运行时成本只是多一点磁盘 IO,但这应该比解析 CSV 快得多。

【讨论】:

    【解决方案2】:

    问题可能是您有足够的内存,但这不是结果。 所以我的建议是使用 std::list

    【讨论】:

    • 一个 std::list 在 64 位平台上的 double 占用至少是数组或向量大小的三倍。链表是最被高估的数据结构,很少是好的选择。
    • 是的,但它可以使用碎片内存,因此可以使用更多的堆空间
    • 它也非常非常慢。而海报的问题不是运行时的堆碎片,而是编译器内存不足。
    • 你说得对,运行时间,但他也说他增加了内存量,错误继续。并且 sizeof(double) 和 sizeof(double*) 都是 8 所以 id 不会减小列表的大小以将其更改为指针
    • 他增加了编译器的堆大小——不是他自己的proram的大小——以及sizeof(double[15000000])(即120000000)和sizeof(double*)(即4或 8) 是巨大的。
    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2012-09-21
    • 2015-10-24
    • 2015-12-29
    • 2017-12-27
    相关资源
    最近更新 更多