繁体   English   中英

具有很大尺寸的2D矢量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM