如何解决Matlab中的内存不足错误?

时间:2013-02-22 10:24:49

标签: windows matlab out-of-memory

我实现了一个matlab代码,用于读取wav文件并对其进行一些分析。 wav文件的大小约为(3-4 G)。 当我运行该文件时,我收到以下错误:

"Out of memory. Type HELP MEMORY for your options"

我试图增加虚拟内存,但它没有用。 以下是我正在使用的代码:

event=0;
[x, fs] = wavread('C:\946707752529.wav');
Ts=1/fs;%  sampling period 
N = length(x);% N is the number of samples
slength = N*Ts;%slength is the length of the sound file in seconds


% Reading the first 180 seconds and find the energy, then set a threshold value
calibration_samples = 180 * fs;
[x2, Fs] = wavread('C:\946707752529.wav', calibration_samples);
Tss=1/Fs;
[b,a]=butter(5,[200 800]/(Fs/2));
y2=filter(b,a,x2);


%This loop is to find the average energy of the samples for the first 180 seconds
startSample=1;
endSample=Fs;
energy=0;
 for i=1:180

    energy=energy+sum(y2(startSample:endSample).^2)*Tss;
    startSample=endSample+1;
    endSample=endSample+Fs;

 end
 mean_energy=energy/180;
 Reference_Energy=mean_energy;% this is a reference energy level
 Threshold=0.65*Reference_Energy;


% Now filtering the whole recorded file to be between [200-800] Hz
[b,a]=butter(5,[200 800]/(fs/2));
y=filter(b,a,x);
N = length(y);
N=N/fs; % how many iteration we need


startSample=1;
endSample=fs;
energy=0;
j=1;
 while( j<=N)
    counter=0;
    energy=sum(y(startSample:endSample).^2)*Ts;

    if (energy<=Threshold)
        counter=counter+1;

        for k=1:9

            startSample=endSample+1;
            endSample=endSample+fs;
            energy=sum(y(startSample:endSample).^2)*Ts;

               if (energy<=Threshold)
                   counter=counter+1;

               else 
                   break;
               end %end inner if
        end % end inner for



    end % end outer IF
     if(counter>=10)
        event=event+1;

     end
    if(counter>0)
        j=j+counter;
    else
        j=j+1;
    end
    startSample=endSample+1;
    endSample=endSample+fs;

 end % end outer For

系统:Windows 7 64位
RAM:8 GB
Matlab:2013

2 个答案:

答案 0 :(得分:2)

我猜wavread实际上将wave文件的所有数据存储到系统内存中。此外,它可能会增加额外的信息。

我看到你正在调用这个函数两次,将结果存储在不同的矩阵中,因此你的文件是3-4G,你需要至少6-8G的内存。但是你的操作系统,Matlab和其他程序也需要一些内存,这就是你出现这种内存不足错误的原因。

一种解决方案是将WAV文件分成多个文件并单独读取。另一个解决方案是只调用一次wavread,并在任何需要的地方使用加载的数据,但不为此重新分配新的内存。

答案 1 :(得分:1)

根据您的代码判断,这可能有效:

  • 在阅读文件后删除除前180秒以外的所有内容
  • 确定阈值
  • 清除除第一段数据以外的所有内容
  • 分析数据并存储结果
  • 清除除下一条数据之外的所有内容......

这假设您的算法正确且有效。

也可能是您的算法存在问题,要检测到这一点,请使用dbstop if error运行代码,并在错误输出时检查所有变量的大小。然后检查其中一个是否太大,你可能发现了错误。