[英]2D vector with very large size
我在c ++中定义了一个2维向量,它的大小太大。 主唱的定义是这样的:
vector<vector<string> > CommunityNodes(3600, vector<string>(240005));
当我运行程序时,出现以下错误:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
在运行程序之前,我在控制台行中接受以下命令,该命令指定堆栈大小将不受限制:
ulimit -s unlimited
但是我又遇到分配错误。如何在c ++中定义这么大的向量?
让我们假设一个std::string
的实现,其中包含一个指向其内容的32位指针,一个用于字符串当前长度的32位int和一个用于当前分配大小的32位int。
这使我们每个字符串12个字节*每行240005个字符串* 3600行,总计9.7 GB,这远远超出了32位实现所能处理的范围。 更糟糕的是,一个实现可能会轻易地将12字节的字符串填充为16字节,从而进一步增加了所需的内存。
如果使用64位实现,则可以寻址更多的内存,但是大小可能会增加一倍,因此仅存储空字符串数组就需要大约20 GB的内存。 添加一些实际内容,您将需要更多内容(同样,可以很容易地将字符串填充为更大的字符串)。
所以,是的,有64位实现这大概可以做工作,但它是不切实际的大多数的目的。 您可能希望/需要找到某种方法来减少使用的字符串数。
尝试预先分配那么多空间,表明您对问题采取了错误的方法。 我怀疑double向量中的大多数节点都将为空。 如果是这种情况,那么使用双映射而不是双向量会更好:
std::map< int, std::map< int, std::string > > CommunityNodes();
然后,仅创建必须具有的条目,而不是预先分配整个数组。
请注意:即使您未为其分配任何内容,使用'[]'运算符也会自动创建一个节点。 如果您不想创建节点,请使用“ find()”而不是“ []”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.