【问题标题】:Memory issues while processing large C arrays处理大型 C 数组时的内存问题
【发布时间】:2014-11-26 03:24:55
【问题描述】:

编辑:原来我不需要乘以 FRAMESIZE。框架来自 libsndfile API(我忽略了它),语义与我的程序中定义框架的方式不同。所以 in 是 size frames * 2 而 mono 是 size frames。

我接受了以下不完全正确的答案,但将我推向了正确的方向。谢谢jxh。


我正在做一些音频工作,用 C++ 编写一个效果器。我有一个输入源,它是一个交错的 2 通道样本数组。我发现将立体声阵列转换为单声道阵列 (getMono()) 的函数在一次调用后导致一些 大量 内存膨胀(之前为 12.7MB,之后为 3.69GB)。它也非常慢。在我的测试用例中,立体声阵列的大小为 800254。

我对 C++ 比较陌生。我在大学里做了很多嵌入式 C,但没有这样的。所以,这可能是一个初学者错误。

我已将我的代码缩减为理解和重现错误所需的最少代码量。本质上,setInput 在 Sukothai 构造函数中被调用,然后生成输入数组的单声道版本。

#define SAMPLE float    
#define RANDOMWIN .5
#define FRAMESIZE 512


void Sukothai::getMono(SAMPLE * stereo, SAMPLE * mono, int monoSize){
  for (int j = 0; j < monoSize; j++) {
    mono[j] = .7071*(stereo[j*2] + stereo[j*2+1]);
  }
}

void Sukothai::setInput(SAMPLE * in, int frames) {
  // per-iteration additional time in terms of seconds
  //float extraTime = RANDOMWIN*2;

  // new buffer size in terms of samples
  //int newSize = ((int)(maxIter*extraTime*2*THE_SRATE)+frames*FRAMESIZE*2);

  //SAMPLE * current_buffer = new SAMPLE[newSize];

  SAMPLE * mono;
  int currentMonoSize = 0;

  currentMonoSize = frames*FRAMESIZE;
  mono = new SAMPLE[currentMonoSize];
  getMono(in, mono, currentMonoSize);
}

现在,这里有三行被注释掉了。这些行创建变量extraTimenewSizecurrent_buffer。这些都是我效果的不同部分的一部分。我在这里对它们进行了注释,以表明它们与立体声到单声道功能无关,但是如果我在代码中将它们注释掉,就会出现分段错误。

有人知道这里发生了什么吗?

编辑:添加了 FRAMESIZE 定义

【问题讨论】:

  • 什么是FRAMESIZE
  • 啊。 FRAMESIZE 是 512。对不起。我会在描述中添加它。这个更大的程序将音频信号分成大小为 512 的帧。因此,每帧中有 512 个左样本和 512 个右样本。
  • frames 代表什么? in中的元素个数?
  • 是的。传入数组的大小,以便我以后可以使用该知识。
  • 你的代码泄露了mono,因为数组永远不会被返回,也不会在函数返回之前被释放。

标签: c++ arrays audio memory segmentation-fault


【解决方案1】:

您在输入数组in 中只有frames 元素,并且您计算currentMonoSize512 乘以该数量。然后,在getMono() 中,您继续从in(不称为stereo)读取两倍的currentMonoSize。这意味着您阅读的内容远远超出了您在in 中指定的元素数量。

从逻辑上讲,mono 数组的元素数量应该是 stereo 输入的一半。

【讨论】:

  • 数组in 的大小为FRAMESIZE * frames * 2。这是帧数,乘以帧大小,乘以 2(对于立体声)。那是双重currentMonoSize
  • 如果framesin 的大小,您计算出的mono 总是大于那个大小。
  • 不是。 FRAMESIZE * frames * 2in 的大小。
  • 我问:“frames 代表什么?in 中的元素数量?”,你回答:“是的。”
  • 是的,我知道。我在上面澄清了。但是,嘿,你把我推向了正确的方向,不管它是否完全正确。我很感激。原来我不需要乘以FRAMESIZEframes 来自 libsndfile API(我忽略了它),语义与我的程序中定义帧的方式不同。所以in 的大小是frames * 2,而单声道的大小是frames。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2011-02-16
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多