我正在使用g ++编译器处理ubuntu中的cpp项目,我需要创建一个大小为1000000x1000000 = 10 ^ 12个元素的矩阵,其条目是布尔变量。但是我的g ++编译器允许我将空间分配给大约1000x1000个元素。我怎样才能克服为这个庞大的矩阵分配空间的问题?
答案 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)
假设:
然后您将需要使用动态分配的数组。通常,链接器/加载器对静态分配的变量可以处理的内容有固定的限制。
尝试:
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的物理内存 - 请记住,随机位访问将导致整个页面交换到磁盘,这需要毫秒级。