У меня есть приложение на C++, где мне иногда требуется большой буфер типов POD (например, массив из 25b illion float
s), который должен храниться в памяти сразу в непрерывном блоке. Эта конкретная организация памяти основана на том, что приложение использует некоторые C API, которые работают с данными. Поэтому другое расположение (например, список меньших фрагментов памяти, таких как std::deque
) не представляется возможным.Возможно ли частично освободить динамически выделенную память в системе POSIX?
Приложение имеет алгоритм, который выполняется в массиве потоковым способом; думаю, что-то вроде этого:
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 ГБ блока памяти могут быть восстановлены после того, как я покончу с этим.
Вы выделяете всю память сразу в начале? Если да: это необходимо? Если нет: вы попробовали ringbuffers? – Gombat
Да, круговой буфер - это то, что вам кажется нужным. –
@ Gombat: Я должен был поместить эту деталь в OP, но более ранний шаг в моей цепочке обработки требует, чтобы весь буфер был в памяти (как непрерывный блок, так как он передается C API) сразу. Иначе да, круговой буфер определенно будет правильным выбором. Алгоритм, на который я ссылаюсь в вопросе, - это заключение к конвейеру нескольких этапов обработки; как только это будет сделано, мне больше не нужны данные. –