Массивный скачок памяти при чтении аудиофайла

В настоящее время я читаю аудио плавающие из файла, используя 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 КБ на страницу).

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

Другие вопросы по тегам