c++ bad_alloc 或从文件读取路径并执行 fft 时发生内存泄漏
c++ bad_alloc or memory leak when reading paths from a file and performing fft
我正在尝试读取带有波形文件路径的文本文件,然后对它们执行 FFT。
但是有时我遇到 std::bad_alloc
错误,或者它只是挂在那里而不是 运行,内存将增加到 100+Gb(我打开一个单独的终端并监视 htop
), 我猜这是一个内存泄漏问题?
有时(1% 的时间),它会 运行 顺利。
文本文件:
name1 /path/to/this/wavpath/name1.wav
name2 /path/to/this/wavpath/name2.wav
name100 /path/to/this/wavpath/name100.wav
主脚本:
int main (int argc, char ** argv) {
// Init (Time) : These are variables for me to count the time taken for ReadingAudio and PerformingFFT
struct timeval start, end;
double time_taken;
double SUM_readaudio, SUM_computeFFT;
double AVG_readaudio, AVG_computeFFT;
vector<double> Dur_readaudio(100,0), Dur_computeFFT(100,0);
gettimeofday(&start, NULL); ios_base::sync_with_stdio(false);
// Init (Read Audio) : These are variables for me to count the time taken for Reading Audio
int AUDIO_DURATION = 5*8000;
vector<double> buffer;
// Init (FFT) : These are variables for me to count the time taken for PerformingFFT
int nfft = 372;
int hop_length = nfft/2;
int numFrames;
vector<vector<double> > Spectrogram(numFrames, vector<double>(nfft/2));
cout << "\n==== Params =====" << endl;
cout << " This exec name = " << argv[0] << endl;
const char* wav_scp = argv[1];
printf("wav_scp = %s\n", wav_scp);
// Create Window
vector<double> windowFunction = computeWindow(nfft);
// Reading wav.scp
unsigned space_idx;
ifstream file(wav_scp);
string uttid, wavpath, curr_line;
int npt=0;
string line;
if (file.is_open()) {
while (getline(file, line)) {
// Get uttid and string path
curr_line = line.c_str();
space_idx = curr_line.find(" ");
uttid = curr_line.substr(0, space_idx);
wavpath = curr_line.substr(space_idx+1, curr_line.length());
gettimeofday(&start, NULL); ios_base::sync_with_stdio(false);
/* Read Audio */
gettimeofday(&end, NULL);
time_taken = get_duration(start, end);
cout << "time_taken=" << time_taken << endl;
gettimeofday(&start, NULL); ios_base::sync_with_stdio(false);
/* Compute FFT */
gettimeofday(&end, NULL);
time_taken = get_duration(start, end);
cout << "time_taken=" << time_taken << endl;
npt++;
}
file.close();
}
cout << "Done" << endl;
return 0 ;
}
我省略了 Read audio
和 Compute FFT
因为我认为它们不会引起问题,
即使我省略了它们,我也面临着同样的问题。
我有时会收到以下错误消息:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
一些观察:
- 注释掉所有
\ Inits (*)
下面多余的行,以及所有\ Read Audio
&\ Compute FFT
代码,可以运行成功
- 但是如果只是将
Inits
下的行带回,而没有 \ Read Audio
和 \ Compute FFT
代码,bad_alloc 有时会发生。
- 如果我注释掉
\ Get uttid and string path
,并分配一个固定的wavpath
,它可以顺利运行 \ Read Audio
& \ Compute FFT
。 (尽管它仍在迭代文本文件,但行未被使用)
变量 numFrames 未初始化。这是未定义的行为。
通常这会导致 Spectrogram 具有任意大小并且很可能非常大,这应该可以解释内存问题。
我正在尝试读取带有波形文件路径的文本文件,然后对它们执行 FFT。
但是有时我遇到 std::bad_alloc
错误,或者它只是挂在那里而不是 运行,内存将增加到 100+Gb(我打开一个单独的终端并监视 htop
), 我猜这是一个内存泄漏问题?
有时(1% 的时间),它会 运行 顺利。
文本文件:
name1 /path/to/this/wavpath/name1.wav
name2 /path/to/this/wavpath/name2.wav
name100 /path/to/this/wavpath/name100.wav
主脚本:
int main (int argc, char ** argv) {
// Init (Time) : These are variables for me to count the time taken for ReadingAudio and PerformingFFT
struct timeval start, end;
double time_taken;
double SUM_readaudio, SUM_computeFFT;
double AVG_readaudio, AVG_computeFFT;
vector<double> Dur_readaudio(100,0), Dur_computeFFT(100,0);
gettimeofday(&start, NULL); ios_base::sync_with_stdio(false);
// Init (Read Audio) : These are variables for me to count the time taken for Reading Audio
int AUDIO_DURATION = 5*8000;
vector<double> buffer;
// Init (FFT) : These are variables for me to count the time taken for PerformingFFT
int nfft = 372;
int hop_length = nfft/2;
int numFrames;
vector<vector<double> > Spectrogram(numFrames, vector<double>(nfft/2));
cout << "\n==== Params =====" << endl;
cout << " This exec name = " << argv[0] << endl;
const char* wav_scp = argv[1];
printf("wav_scp = %s\n", wav_scp);
// Create Window
vector<double> windowFunction = computeWindow(nfft);
// Reading wav.scp
unsigned space_idx;
ifstream file(wav_scp);
string uttid, wavpath, curr_line;
int npt=0;
string line;
if (file.is_open()) {
while (getline(file, line)) {
// Get uttid and string path
curr_line = line.c_str();
space_idx = curr_line.find(" ");
uttid = curr_line.substr(0, space_idx);
wavpath = curr_line.substr(space_idx+1, curr_line.length());
gettimeofday(&start, NULL); ios_base::sync_with_stdio(false);
/* Read Audio */
gettimeofday(&end, NULL);
time_taken = get_duration(start, end);
cout << "time_taken=" << time_taken << endl;
gettimeofday(&start, NULL); ios_base::sync_with_stdio(false);
/* Compute FFT */
gettimeofday(&end, NULL);
time_taken = get_duration(start, end);
cout << "time_taken=" << time_taken << endl;
npt++;
}
file.close();
}
cout << "Done" << endl;
return 0 ;
}
我省略了 Read audio
和 Compute FFT
因为我认为它们不会引起问题,
即使我省略了它们,我也面临着同样的问题。
我有时会收到以下错误消息:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
一些观察:
- 注释掉所有
\ Inits (*)
下面多余的行,以及所有\ Read Audio
&\ Compute FFT
代码,可以运行成功 - 但是如果只是将
Inits
下的行带回,而没有\ Read Audio
和\ Compute FFT
代码,bad_alloc 有时会发生。 - 如果我注释掉
\ Get uttid and string path
,并分配一个固定的wavpath
,它可以顺利运行\ Read Audio
&\ Compute FFT
。 (尽管它仍在迭代文本文件,但行未被使用)
变量 numFrames 未初始化。这是未定义的行为。
通常这会导致 Spectrogram 具有任意大小并且很可能非常大,这应该可以解释内存问题。