空间高效的c++矢量分配器,用于大矢量

Space efficient C++ vector allocator for large vectors?

本文关键字:用于 分配器 高效 c++ 空间      更新时间:2023-10-16

我正在处理一些c++代码,这些代码实现了一个图形算法,该算法使用了大量的小块内存(相对于gSpan,但这并不重要)。该代码是用c++实现的,并使用std::vectors来存储许多小元素(每个元素的大小为64字节)。然而,我在比原作者大得多的数据集上使用它,而且我的内存快用完了。

然而,似乎我过早地耗尽了内存。分裂?我怀疑这是因为std::vectors每次需要更多内存时都试图增加大小,而vector坚持使用连续内存。我有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

所以,很明显,我们已经达到了vector的最大大小,库试图分配更多,但失败了。

我的问题是:

  • 我的假设是正确的问题是什么?
  • 解决方案是什么(除了"购买更多RAM")。我愿意用CPU时间来换取内存。
  • 我应该将整个代码转换为使用std::list(并以某种方式实现操作符[]为代码使用它的地方吗?这样会更有效率吗?至少它允许列表元素不连续,对吧?
  • 是否有一个更好的分配器,我可以用它来覆盖这个用例的矢量标准?
  • 我还缺少其他解决方案吗?

因为我不知道最终会使用多少内存,我知道即使我做出改变,仍然可能没有足够的内存来做我的计算,但我怀疑我至少可以得到很多比我现在得到的,这似乎是很快放弃。

我会尝试使用std::deque作为vector的直接插入。有一种可能性,因为它(经常)使用一个块集合,扩展deque可能比扩展vector便宜得多(就所需的额外内存而言)。