我目前正在使用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音频文件可能会导致内存中出现如此大量的峰值。
答案 0 :(得分:3)
会15839544 * 2浮子的数量导致这些巨大的尖峰?
是的,绝对的。浮点数为4个字节,因此每个1580万个浮点数的两个数组总共约为120 MB。
至于你如何从5 MB输入文件中结束这一点:音频压缩是一件了不起的事情。 :)
答案 1 :(得分:1)
它可能是虚拟内存 - 虽然不是通常(错误)理解的方式。
虚拟内存是映射到进程的可用地址空间。它可能会也可能不会备份内存的物理页面。
访问未备份的页面会导致页面错误,内核随后会以多种方式提供服务:
因此,大量内存(大于可用物理页面)的malloc()
趋于成功,而操作系统有足够的RAM来分配页面描述符以将虚拟空间映射到进程中(尽管可能如果此时超出资源限制则下降)。实际写入分配的空间的尝试逐渐将物理页面拉入进程。
您指示的大小实际上是~128MB的内存。你不太可能在iDevice上使用这么多物理RAM,所以我认为我们可以假设它并非全部被使用。您可以获取页面错误数量的统计信息 - 这将使您对使用的数量有所了解(大概每页4kB)。
我希望您的流程的虚拟机统计信息包含此分配。