2

我正在使用一些 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

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

所以我的问题是:

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

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

4

1 回答 1

6

我会尝试将std::deque其用作vector. 有一种可能性是,由于它(通常)使用一组块,扩展dequea 可能比扩展 a 便宜得多vector(就所需的额外内存而言)。

于 2013-04-05T19:29:40.263 回答