2D矢量,非常大的尺寸

时间:2014-01-18 07:14:07

标签: c++ ubuntu g++

我在c ++中定义了一个二维向量,它的大小太大了。 voctor定义是这样的:

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 ++中定义这样的大向量吗?

2 个答案:

答案 0 :(得分:3)

假设std::string的实现包含一个指向其内容的32位指针,一个32位int用于当前字符串长度,一个32位int用于当前分配大小。

这给了我们每个字符串12个字节*每行240005个字符串* 3600行,可以达到9.7千兆字节 - 远远超过32位实现的处理能力。更糟糕的是,一个实现可能很容易将这个12字节的字符串填充到16个字节,从而增加了所需的内存。

如果你去64位实现,你可以寻址更多的内存,但是大小可能会翻倍,所以你需要大约20千兆字节的内存才能存储空字符串数组。添加一些实际内容,你需要更多(并且,再次,字符串可以很容易地填充为更大)。

所以,是的,使用64位实现,这个可能可能会起作用,但对于大多数目的来说它是不切实际的。您可能希望/需要找到一些方法来减少您使用的字符串数量。

答案 1 :(得分:0)

尝试预先分配这么多空间表明您采取了错误的方法解决问题。我怀疑双向量中的大多数节点都是空的。如果是这种情况,那么使用双重映射而不是双向量会更好:

std::map< int, std::map< int, std::string > > CommunityNodes();

然后,您只需创建必须具有的条目,而不是预先分配整个数组。

请注意:使用'[]'运算符会自动创建一个节点,即使您没有为其指定任何内容。如果您不想创建节点,请使用'find()'而不是'[]'。