用于大型向量的节省空间的C ++向量分配器?

时间:2013-04-05 19:08:14

标签: c++ memory-management stdvector

我正在使用一些C ++代码,这些代码实现了一个使用大量内存的图形算法(gSpan的亲戚,但这并不重要)。代码在C ++中实现,并使用std :: vectors来存储许多小元素(每个元素大约64个字节)。但是,我在比原作者更大的数据集上使用它,而且我的内存不足。

然而,似乎我过早地耗尽了内存。不成?我怀疑这是因为std :: vectors每次需要更多内存时都会尝试增加大小,并且向量会依赖于连续的内存。我有8GB内存和18GB交换,但是当抛出std :: bad_alloc时,我只使用6.5GB驻留和~8GB虚拟。我抓住了bad_alloc调用并打印出矢量大小,这就是我所看到的:

size: 536870912
capacity: 536870912
maxsize: 1152921504606846975
terminate called after throwing an instance of 'std::bad_alloc'
    what():  std::bad_alloc

所以,显然,我们已达到向量的最大大小,并且库试图分配更多,并且失败。

所以我的问题是:

  • 我认为这是问题所在,我是否正确?
  • 解决方案是什么(除了“购买更多内存”)。我愿意交换CPU时间以适应内存。
  • 我应该将整个代码转换为使用std :: list(并以某种方式为代码使用它的地方实现operator [)吗?)..那甚至会更有效吗?至少它会允许列表元素不连续......对吧?
  • 那里有一个更好的分配器,我可以用来覆盖这个用例的矢量标准吗?
  • 我缺少哪些其他解决方案?

由于我不知道最终会使用多少内存,所以我知道即使我进行了更改,仍然可能没有足够的内存来进行计算,但我怀疑我至少可以获得更多内存。我现在开始了,这似乎很快就放弃了。

1 个答案:

答案 0 :(得分:6)

我会尝试使用std::deque作为vector的直接插入内容。有可能因为它(通常)使用了一组块,所以扩展deque可能比扩展vector便宜得多(就额外的内存而言)。