Лучше всего понимать шаблоны распределения вашей программы, если это проблема, для которой вам необходимо оптимизировать. Это достигается путем понимания реализации программы, архитектуры (ов), в которой она выполняется внутри, и путем наблюдения (например, профилирование времени и памяти).
По правде говоря, вы можете оптимизировать со многих точек зрения, но с течением времени меняются вещи (изменения вносимые, изменение окружения). На пользовательской земле использование вашей памяти уже уже догадалось.
Учитывая ваши размеры размещения, я предполагаю, что вы уже в зависимости от системы, которая по умолчанию будет использовать резервный магазин по мере необходимости. Таким образом, вы не имеете большого контроля над тем, что вызывается или когда. В этом случае просмотр в доступной физической памяти не стоит рассматривать, и вам придется много работать, чтобы добиться успеха, чем существующая реализация виртуальной памяти системы. Некоторые из этих систем пытаются использовать всю доступную память (например, «Неиспользуемая ОЗУ - это потерянное ОЗУ»).
Сказав это, и если эти предположения верны: часто бывает лучше просто уменьшить размеры распределения и рабочие наборы и самостоятельно выполнять ввод/вывод.
Возможно, ваши ОС также используют кеширование диска; чтение и запись, вероятно, быстрее, чем вы подозреваете в больших блоках памяти.
Еще глубже: использовать виртуальные памяти или файлы с отображением памяти для этих больших наборов данных. Ваше ядро, скорее всего, справится с этими случаями.
Очевидно, что я не собираюсь предполагать этот сценарий наихудшего случая и выделять всю эту память вперед.
Тогда вы, вероятно, будете удивлены, узнав, что в одиночку 2 ГБ calloc
может быть лучше, чем другие альтернативы люди придумали в некоторых средах, поскольку большая calloc
может просто зарезервировать домен в виртуальной памяти, загрузки/инициализации страниц только когда вы обращаетесь к ним. В зависимости от вашего использования этот подход будет намного лучше, чем некоторые альтернативы, которые вы можете получить.
Хорошая отправная точка для многих проблем при понимании схемы распределения программ или входных данных заключается в том, чтобы начать консервативную работу, а затем сделать самые выгодные корректировки, основанные на наблюдении.Во многих случаях вам понадобится немного больше информации, чем а) точное определение того, сколько нужно изменить размер, когда требуется изменение размера; б) повторное использование распределений, если это необходимо; в) надлежащим образом разрабатывать ваши данные для проблемы.
Существует мало необходимости в этом, если буфер должен быть выделен в нескончаемых кусках, как представляется, здесь. Все зависит от того, как индексируются данные, эффективности распределителя и целевой системы, но я бы сказал, что у меня есть довольно небольшие блоки фиксированного размера, так как это гораздо реже вызывает проблемы с фрагментацией, а распределение достаточно дешево – doynax
Они могут быть выделенным последовательно способом, которым я его реализую. Оставшееся выделенное пространство присваивается первому блоку кэша, который ему нужен. Когда выделенное пространство исчерпано, выделяется больше. – Dan