读取音频文件时出现大量内存峰值

时间:2012-08-08 22:19:09

标签: ios c malloc extaudiofile

我目前正在使用Dirac的(OSStatus) readFloatsConsecutive:(SInt64)numFrames intoArray:(float**)audio函数从文件中读取音频浮点数。我创建了一个float **

的指针
arrayToFill = malloc(channelCount * sizeof(float*));

for(int i = 0; i < channelCount; ++i)
{
    arrayToFill[i] = malloc(frameCount * sizeof(float));
}

并将其传递给Dirac函数当所有浮点数被捕捉时,我得到了大量的内存峰值。

在乐器中,我的峰值增加了大约90MB,并且出于某种原因,这个应用程序仍在设备上运行。

会15839544 * 2浮子的数量导致这些巨大的尖峰?

它如何使用如此多的内存?它是虚拟内存吗?我没有看到任何VM分配。

我看不到如何加载单个文件,例如5MB音频文件可能会导致内存中出现如此大量的峰值。

2 个答案:

答案 0 :(得分:3)

  

会15839544 * 2浮子的数量导致这些巨大的尖峰?

是的,绝对的。浮点数为4个字节,因此每个1580万个浮点数的两个数组总共约为120 MB。

至于你如何从5 MB输入文件中结束这一点:音频压缩是一件了不起的事情。 :)

答案 1 :(得分:1)

它可能是虚拟内存 - 虽然不是通常(错误)理解的方式。

虚拟内存是映射到进程的可用地址空间。它可能会也可能不会备份内存的物理页面。

访问未备份的页面会导致页面错误,内核随后会以多种方式提供服务:

  • 分配新的归零页面
  • 分配页面并使用内存映射文件页面填充其内容
  • 分配页面并从页面文件中填写其内容
  • 未执行上述任何操作并终止该应用程序

因此,大量内存(大于可用物理页面)的malloc()趋于成功,而操作系统有足够的RAM来分配页面描述符以将虚拟空间映射到进程中(尽管可能如果此时超出资源限制则下降)。实际写入分配的空间的尝试逐渐将物理页面拉入进程。

您指示的大小实际上是~128MB的内存。你不太可能在iDevice上使用这么多物理RAM,所以我认为我们可以假设它并非全部被使用。您可以获取页面错误数量的统计信息 - 这将使您对使用的数量有所了解(大概每页4kB)。

我希望您的流程的虚拟机统计信息包含此分配。