【发布时间】:2015-09-16 19:06:00
【问题描述】:
我有一个 C++ 应用程序,有时我需要将大量 POD 类型缓冲区(例如,25 个billion floats 的数组)一次保存在内存中的一个连续块中。这种特殊的内存组织是由应用程序使用一些对数据进行操作的 C API 驱动的。因此,不同的安排(例如像std::deque 使用的较小内存块的列表)是不可行的。
应用程序有一个以流方式在数组上运行的算法;这样想:
std::vector<float> buf(<very_large_size>);
for (size_t i = 0; i < buf.size(); ++i) do_algorithm(buf[i]);
此特定算法是已应用于数据集的早期处理步骤管道的结论。因此,一旦我的算法通过了数组中的i-th 元素,应用程序就不再需要它了。
因此,理论上,我可以释放该内存以减少应用程序在处理数据时的内存占用。但是,执行类似于 realloc()(或 std::vector<T>::shrink_to_fit())的操作会效率低下,因为我的应用程序必须在重新分配时将未使用的数据复制到新位置。
我的应用程序在符合 POSIX 的操作系统(例如 Linux、OS X)上运行。有没有什么接口可以让操作系统只从内存块的前面释放一个指定的区域?这似乎是最有效的方法,因为我可以通知内存管理器,例如,内存块的前 2 GB 可以在我完成后回收。
【问题讨论】:
-
一开始你会一次性分配所有内存吗?如果是:这有必要吗?如果没有:您是否尝试过环形缓冲区?
-
是的,你似乎需要一个循环缓冲区。
-
@Gombat:我应该把这个细节放在 OP 中,但是我的处理链中的更早一步要求整个缓冲区都在内存中(作为一个连续的块,因为它被传递给 C API) 一次。否则是的,循环缓冲区肯定是正确的选择。我在问题中提到的算法是对多个处理步骤的管道的结论;完成后,我不再需要数据。
-
@JasonR 您应该将此信息编辑到问题中,这很重要。
-
@JasonR:您能否更具体地说明您实际想要实现的目标?整个计算需要多长时间,系统通常内存不足,还是您只是想“减少运行
top时显示的数字”? [是的,我意识到我已经写了一个答案!]
标签: c++ memory memory-management posix