2013-12-04 3 views
5

Я реализовал многоуровневый симулятор кэша, который должен хранить значения, находящиеся в настоящее время в симуляторе. При текущих конфигурациях максимальный размер всех сохраненных значений может достигать 2G. Очевидно, я не собираюсь предполагать этот худший сценарий и выделять всю эту память вперед. Вместо этого у меня есть программа для распределения памяти по мере необходимости в кусках. Расход этого распределения усугубляется тем фактом, что я calloc ing, чтобы обеспечить 0 значений, если ранее запись не была выполнена в указанном месте.Какова оптимальная сумма для malloc в данный момент времени, когда общая сумма не известна?

Мой вопрос в том, есть ли хорошая эвристика для того, сколько памяти должно быть распределено каждый раз, когда нужно больше? В настоящее время я использую произвольное значение, и я рассмотрел некоторое решение, которое будет использовать некоторое отношение общей системной памяти (я полагаю, что это возможно для динамического обнаружения этого при компиляции и/или во время выполнения), но даже с последним я использую произвольное соотношение с по-прежнему не очень хорошо со мной.

Любое понимание лучших практик для такого рода ситуаций было бы оценено!

ответ

1

Обычное эмпирическое правило состоит в том, чтобы расти геометрически, например, путем удвоения, при каждом перераспределении.

+0

Существует мало необходимости в этом, если буфер должен быть выделен в нескончаемых кусках, как представляется, здесь. Все зависит от того, как индексируются данные, эффективности распределителя и целевой системы, но я бы сказал, что у меня есть довольно небольшие блоки фиксированного размера, так как это гораздо реже вызывает проблемы с фрагментацией, а распределение достаточно дешево – doynax

+0

Они могут быть выделенным последовательно способом, которым я его реализую. Оставшееся выделенное пространство присваивается первому блоку кэша, который ему нужен. Когда выделенное пространство исчерпано, выделяется больше. – Dan

0

Лучше всего понимать шаблоны распределения вашей программы, если это проблема, для которой вам необходимо оптимизировать. Это достигается путем понимания реализации программы, архитектуры (ов), в которой она выполняется внутри, и путем наблюдения (например, профилирование времени и памяти).

По правде говоря, вы можете оптимизировать со многих точек зрения, но с течением времени меняются вещи (изменения вносимые, изменение окружения). На пользовательской земле использование вашей памяти уже уже догадалось.

Учитывая ваши размеры размещения, я предполагаю, что вы уже в зависимости от системы, которая по умолчанию будет использовать резервный магазин по мере необходимости. Таким образом, вы не имеете большого контроля над тем, что вызывается или когда. В этом случае просмотр в доступной физической памяти не стоит рассматривать, и вам придется много работать, чтобы добиться успеха, чем существующая реализация виртуальной памяти системы. Некоторые из этих систем пытаются использовать всю доступную память (например, «Неиспользуемая ОЗУ - это потерянное ОЗУ»).

Сказав это, и если эти предположения верны: часто бывает лучше просто уменьшить размеры распределения и рабочие наборы и самостоятельно выполнять ввод/вывод.

Возможно, ваши ОС также используют кеширование диска; чтение и запись, вероятно, быстрее, чем вы подозреваете в больших блоках памяти.

Еще глубже: использовать виртуальные памяти или файлы с отображением памяти для этих больших наборов данных. Ваше ядро, скорее всего, справится с этими случаями.

Очевидно, что я не собираюсь предполагать этот сценарий наихудшего случая и выделять всю эту память вперед.

Тогда вы, вероятно, будете удивлены, узнав, что в одиночку 2 ГБ calloc может быть лучше, чем другие альтернативы люди придумали в некоторых средах, поскольку большая calloc может просто зарезервировать домен в виртуальной памяти, загрузки/инициализации страниц только когда вы обращаетесь к ним. В зависимости от вашего использования этот подход будет намного лучше, чем некоторые альтернативы, которые вы можете получить.

Хорошая отправная точка для многих проблем при понимании схемы распределения программ или входных данных заключается в том, чтобы начать консервативную работу, а затем сделать самые выгодные корректировки, основанные на наблюдении.Во многих случаях вам понадобится немного больше информации, чем а) ​​точное определение того, сколько нужно изменить размер, когда требуется изменение размера; б) повторное использование распределений, если это необходимо; в) надлежащим образом разрабатывать ваши данные для проблемы.

Смежные вопросы