如何初始化大尺寸的1000000x1000000的二维阵列?

时间:2013-09-09 22:39:15

标签: c++ linux gcc memory-management multidimensional-array

我正在使用g ++编译器处理ubuntu中的cpp项目,我需要创建一个大小为1000000x1000000 = 10 ^ 12个元素的矩阵,其条目是布尔变量。但是我的g ++编译器允许我将空间分配给大约1000x1000个元素。我怎样才能克服为这个庞大的矩阵分配空间的问题?

3 个答案:

答案 0 :(得分:6)

你不能,除非你有至少125GB的RAM(假设你每bool只需要一个位)。如果你真的需要大的结构,你需要购买大量的RAM或考虑磁盘算法。

但是,解决问题的可能性实际上并不需要10 ^ 6 x 10 ^ 6阵列,因此您应该首先重新考虑算法。

有些库允许磁盘上的数据结构(http://roomy.sourceforge.net/会浮现在脑海中,而另一个库的名称我现在无法回忆起来),但磁盘访问速度比RAM慢几个数量级。除非您仔细考虑过这一点,否则您可能对基于磁盘的解决方案的性能不满意。

答案 1 :(得分:0)

如果大多数值为零(false),请尝试考虑稀疏矩阵。这样可以节省空间。通常你不能创建如此大的数组。


此处vector<bool>::max_size()将是正确的限制。但实际上标准并不能保证这种分配是可能的。

注意:我的msvc编译器显示总数组大小不应超过0x7fffffff

答案 2 :(得分:0)

假设:

  • 您使用的是64位系统,因为32位系统没有足够的虚拟地址空间来容纳如此庞大的数组
  • 您有足够的物理ram和磁盘交换空间来容纳数组

然后您将需要使用动态分配的数组。通常,链接器/加载器对静态分配的变量可以处理的内容有固定的限制。

尝试:

static_assert(sizeof(size_t) == 8, "64-bit required");

constexpr size_t N = 1000000;

vector<bool> V(N*N);

inline decltype(V[0]) get(size_t x, size_t y) { return V[x*N + y]; }

除非您拥有100GB的物理内存 - 请记住,随机位访问将导致整个页面交换到磁盘,这需要毫秒级。

相关问题