我正在使用 g++ 编译器在 ubuntu 中开发一个 cpp 项目,我需要创建一个大小为 1000000x1000000 = 10^12 个元素的矩阵,其条目是布尔变量。但是我的 g++ 编译器只允许我为大约 1000x1000 个元素分配空间。如何克服为这个巨大的矩阵分配空间的问题?
问问题
1540 次
3 回答
6
你不能,除非你有至少 125GB 的 RAM(假设你只需要一个位bool
)。如果你真的需要这么大的结构,你需要购买大量的 RAM 或考虑磁盘算法。
但很有可能解决您的问题实际上并不需要 10^6 x 10^6 数组,因此您应该首先重新考虑您的算法。
有一些库允许磁盘上的数据结构(我想到了http://roomy.sourceforge.net/,还有一个我现在记不起名字的库),但是磁盘访问比 RAM 慢几个数量级. 除非您对此进行了彻底的考虑,否则您可能不会对基于磁盘的解决方案的性能感到满意。
于 2013-09-09T22:40:58.617 回答
0
如果大多数值为零(假),请尝试考虑稀疏矩阵。这将节省空间。通常你不能创建这么大的数组。
这vector<bool>::max_size()
将是正确的限制。但实际上标准并不能保证这种分配是可能的。
注意:我的 msvc 编译器显示总数组大小不应超过0x7fffffff
.
于 2013-09-09T22:43:41.667 回答
0
假设:
- 您在 64 位系统上,因为 32 位系统没有足够的虚拟地址空间来容纳如此大的数组
- 您有足够的物理内存和磁盘交换空间来容纳阵列
然后,您将需要使用动态分配的数组。通常,链接器/加载器在静态分配变量方面对它可以处理的内容有固定的限制。
尝试:
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 的物理内存 - 请记住,随机位访问将导致整个页面被交换到磁盘,这需要以毫秒为单位。
于 2013-09-09T23:52:41.133 回答