空间高效的c++矢量分配器,用于大矢量
Space efficient C++ vector allocator for large vectors?
我正在处理一些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
便宜得多(就所需的额外内存而言)。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- c++ 中的自定义分配器,用于不调用secure_string实现
- 为什么我的代码不适用于自定义分配器?
- 没有用于初始化我的自定义分配器的匹配构造函数
- 自定义分配器上的额外移动结构用于叮当声
- 函数模板由用于构建不同类型的容器的分配器参数化
- 如何使用分配器用于 std::vector
- 用于块内存的简单自定义分配器
- 用于跨线程分配和自由的良好分配器
- 用于快速 std::wstring 分配的自定义分配器
- 自定义分配器,用于将stl矢量存储在OpenGL缓冲区对象中
- 自定义分配器可用于vector,但不能用于deque(封装在队列中)
- 空间高效的c++矢量分配器,用于大矢量
- 用于分配器类型参数的C++设计模式
- 是否有用于多线程内存分配器的验证套件