【问题标题】:Segmentation fault due to large 2D Array in C由于 C 中的大型 2D Array 导致的分段错误
【发布时间】:2018-08-28 04:38:15
【问题描述】:

下面的代码是由解析的 SIZE 参数生成的,在这种情况下,您在任何地方看到“2512555”都是解析的 SIZE 参数。我遇到的问题是数组太大并导致分段错误。

有没有办法在不更改 SIZE 参数的情况下克服分段错误?此参数的范围为 0 - 400,000。

#include <stdio.h>
#include <stdlib.h>

double templ25_mem1[2512555][2512555];

int main() 
{
  int templ25_mem1_index1=0;
  int templ25_mem1_index2=0;

    for(templ25_mem1_index1; templ25_mem1_index1 < 2512555; templ25_mem1_index1++)
    {
      for(templ25_mem1_index2; templ25_mem1_index2 < 2512555; templ25_mem1_index2++)
      {
            int rndRow = rand() % 2512555;
            int rndCol = rand() % 2512555;

            templ25_mem1[rndRow][rndCol] = 0x7FFFFFFF;
            templ25_mem1[rndRow][rndCol];    
      }
    }
}

【问题讨论】:

  • 我的编译器甚至不让这段代码编译。
  • 分段错误可能是@ArthurDent的原因
  • 考虑到双倍的 8 个字节,你分配 8*2512555*2512555 = 50503 GB 你的机器支持吗
  • 我认为我对数组的分配完全错误,我想我的问题应该是现在。我如何将 2512555 分配到二维数组中,而不是原来的 8*2512555*2512555 = 50503 GB
  • @Jason 据我所知,这是不可能的 2512225,你需要有完美的平方值,在你的情况下 2512225 更接近 2512555 和一个完美的平方,你可以使用double temp[1585][1585]

标签: c arrays memory memory-management


【解决方案1】:

要在不更改 SIZE 参数的情况下克服分段错误,当大小可能很大时,您需要重新设计数据结构。

例如,您可以将这个巨大的数组放在一个临时文件中,您可以在其中将部分交换到主内存中。您可能还需要两级寻址,因为您必须确保可以对磁盘上的阵列进行寻址(45TB 大于可用地址空间,并且可能大于最大的 int)。

最好的办法是再次检查需求,看看他们是否真的需要这么大的数组,或者他们是否允许其他方法来实现他们的目标。

【讨论】:

  • 是的,基本上。我的下一个问题是,我如何分配这个数组以使我的二维数组有 2512555 个索引?谢谢
  • 您占用了您想要/可以用于阵列的最大内存量。您将 SIZE 除以它并截断为 int。这就是您需要的文件中有多少块。该文件不能大于seek() 偏移量的大小;如果它更大,则必须使用多个文件。等等。更多问题:发挥创造力,动动脑筋。
猜你喜欢
  • 1970-01-01
  • 2013-01-24
  • 2018-01-02
  • 1970-01-01
  • 2018-12-09
  • 2015-01-10
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多