Массивный скачок памяти при чтении аудиофайла
В настоящее время я читаю аудио плавающие из файла, используя Dirac's (OSStatus) readFloatsConsecutive:(SInt64)numFrames intoArray:(float**)audio
функция. Я создаю указатель с плавающей точкой **
arrayToFill = malloc(channelCount * sizeof(float*));
for(int i = 0; i < channelCount; ++i)
{
arrayToFill[i] = malloc(frameCount * sizeof(float));
}
и передать его функции Дирака, я получаю массивный всплеск памяти, когда все поплавки имеют неправильное расположение.
В приборах я получаю всплески, которые увеличиваются примерно на 90 МБ, и по какой-то причине это приложение все еще работает на устройстве.
Например, может ли 15839544 * 2 число поплавков вызвать эти массивные шипы?
Как он может использовать столько памяти? Это виртуальная память? Я не вижу каких-либо распределений виртуальных машин.
Я не вижу, как загрузка одного файла, например, 5 МБ аудиофайла, может привести к таким огромным скачкам в памяти.
2 ответа
Например, может ли 15839544 * 2 число поплавков вызвать эти массивные шипы?
Да, конечно. Число с плавающей запятой составляет 4 байта, поэтому два массива по 15,8 миллиона с плавающей запятой составляют около 120 МБ.
Что касается того, как вы в конечном итоге получаете это из входного файла объемом 5 МБ: Сжатие звука - удивительная вещь.:)
Вероятно, это виртуальная память - хотя и не так, как ее обычно (неправильно) понимают.
Виртуальная память - это доступное адресное пространство, отображаемое в процессе. Это может или не может быть зарезервировано с физическими страницами памяти.
Доступ к странице, резервная копия которой не является таковой, приводит к ошибке страницы, которую ядро затем обслуживает одним из следующих способов:
- Выделение новой обнуленной страницы
- Выделение страницы и заполнение ее содержимого страницей файла с отображенной памятью
- Выделение страницы и заполнение ее содержимого из файла подкачки
- Не делая ничего из вышеперечисленного и прекращая приложение
Таким образом, malloc()
большой объем памяти (больше, чем доступные физические страницы) имеет тенденцию к успеху, в то время как операционная система имеет достаточно ОЗУ для выделения дескрипторов страниц для сопоставления виртуального пространства с процессом (хотя это может уменьшиться, если в этот момент превышены ограничения ресурсов). Попытки фактически записать в выделенное пространство постепенно затягивают в процесс физические страницы.
Указанный вами размер составляет ~128 МБ памяти. Маловероятно, что у вас есть столько физической памяти, чтобы играть на iDevice, так что я думаю, мы можем предположить, что это не все используется. Вы, вероятно, можете получить статистику по количеству сбоев страниц - это даст вам хорошее представление об используемом объеме (предположительно, 4 КБ на страницу).
Я ожидаю, что статистика виртуальных машин для вашего процесса будет включать это распределение.