List<List<float>> 达到内存限制
List<List<float>> hitting memory limits
当我打开大型音频文件时,出现内存不足错误。
我知道这种方法不常见,所以我想我必须问一个真正的科学家。
我遇到了以下情况:
public static List<List<float>> int_filenamewavedataRight = new List<List<float>>();
从那里我打开一个音频文件并加载此数组中的音频电平值,这样我就可以通过 naudio 库正确查看它们。
我像这样为新文件清除数组:
int_filenamewavedataRight.Clear();
int_filenamewavedataRight.Add(new List<float>());
然后,我将所有值加载到内存中以快速显示波形:
waveStream.Position = 0;
int bytesRead;
byte[] waveData = new byte[bytesPerSample];
waveStream.Position = 0; // startPosition + (e.ClipRectangle.Left * bytesPerSample * samplesPerPixel);
int samples = (int)(waveStream.Length / bytesPerSample);
wavepeakloaded = 0;
int OldPrecentVal = 0;
for (int x = 0; x < samples; x++)
{
short high = 0;
bytesRead = waveStream.Read(waveData, 0, bytesPerSample);
if (bytesRead == 0)
break;
for (int n = 0; n < bytesRead; n += 2)
{
short sample = BitConverter.ToInt16(waveData, n);
if (sample > high) high = sample;
}
float highPercent2 = (float)Math.Round(((((float)high) - short.MinValue) / ushort.MaxValue), 2);
// ERRORING HERE
// ERRORING HERE
int_filenamewavedataRight[filename_value].Add((float)Math.Round(highPercent2, 2));
// ERRORING HERE
// ERRORING HERE
}
5 分钟的典型歌曲的小音频文件没问题,但 25 分钟或更长时间的较长文件会在计数为 67108864 时产生异常,然后我得到“异常类型 'System.OutOfMemoryException' 被抛出。"
x = {"Exception of type 'System.OutOfMemoryException' was thrown."}
ex.StackTrace " at System.Collections.Generic.List`1.set_Capacity(Int32 value)\r\n at System.Collections.Generic.List`1.EnsureCapacity(Int32 min)\r\n at System.Collections.Generic.List`1.Add(T item)\r\n at APP.WaveViewer.LoadWaveToMemory(Int32 filename_value) in WaveViewer.cs:line 1391"
我正在使用一个列表的列表,这样我就可以像一个简单的数组一样对音频文件进行寻址,但是因为我不知道数组的初始大小,所以我可以指定一个初始大小。
我也像这样预加载波形数据,这样我就可以同时播放、缩放和平移音频文件。
这很容易解决吗,或者我应该找到其他方法来解决这个问题,例如将这些峰值体积值写入临时文件,而不是将它们保存在内存中,或者有更好的方法吗?
我在网上的各个地方都看过这个,比如 here 但是,这样做似乎很少见。
谢谢。
简单的答案是 运行 在 32 位 (x86) 中没有足够的分配给 50,000,000+ 个样本。
相反,将程序更改为 x64 解决了该特定问题。
这就是我喜欢 SO 的地方,您可以汇集这么多人的资源并在提问时学习。
当我打开大型音频文件时,出现内存不足错误。
我知道这种方法不常见,所以我想我必须问一个真正的科学家。
我遇到了以下情况:
public static List<List<float>> int_filenamewavedataRight = new List<List<float>>();
从那里我打开一个音频文件并加载此数组中的音频电平值,这样我就可以通过 naudio 库正确查看它们。
我像这样为新文件清除数组:
int_filenamewavedataRight.Clear();
int_filenamewavedataRight.Add(new List<float>());
然后,我将所有值加载到内存中以快速显示波形:
waveStream.Position = 0;
int bytesRead;
byte[] waveData = new byte[bytesPerSample];
waveStream.Position = 0; // startPosition + (e.ClipRectangle.Left * bytesPerSample * samplesPerPixel);
int samples = (int)(waveStream.Length / bytesPerSample);
wavepeakloaded = 0;
int OldPrecentVal = 0;
for (int x = 0; x < samples; x++)
{
short high = 0;
bytesRead = waveStream.Read(waveData, 0, bytesPerSample);
if (bytesRead == 0)
break;
for (int n = 0; n < bytesRead; n += 2)
{
short sample = BitConverter.ToInt16(waveData, n);
if (sample > high) high = sample;
}
float highPercent2 = (float)Math.Round(((((float)high) - short.MinValue) / ushort.MaxValue), 2);
// ERRORING HERE
// ERRORING HERE
int_filenamewavedataRight[filename_value].Add((float)Math.Round(highPercent2, 2));
// ERRORING HERE
// ERRORING HERE
}
5 分钟的典型歌曲的小音频文件没问题,但 25 分钟或更长时间的较长文件会在计数为 67108864 时产生异常,然后我得到“异常类型 'System.OutOfMemoryException' 被抛出。"
x = {"Exception of type 'System.OutOfMemoryException' was thrown."}
ex.StackTrace " at System.Collections.Generic.List`1.set_Capacity(Int32 value)\r\n at System.Collections.Generic.List`1.EnsureCapacity(Int32 min)\r\n at System.Collections.Generic.List`1.Add(T item)\r\n at APP.WaveViewer.LoadWaveToMemory(Int32 filename_value) in WaveViewer.cs:line 1391"
我正在使用一个列表的列表,这样我就可以像一个简单的数组一样对音频文件进行寻址,但是因为我不知道数组的初始大小,所以我可以指定一个初始大小。
我也像这样预加载波形数据,这样我就可以同时播放、缩放和平移音频文件。
这很容易解决吗,或者我应该找到其他方法来解决这个问题,例如将这些峰值体积值写入临时文件,而不是将它们保存在内存中,或者有更好的方法吗?
我在网上的各个地方都看过这个,比如 here 但是,这样做似乎很少见。
谢谢。
简单的答案是 运行 在 32 位 (x86) 中没有足够的分配给 50,000,000+ 个样本。
相反,将程序更改为 x64 解决了该特定问题。
这就是我喜欢 SO 的地方,您可以汇集这么多人的资源并在提问时学习。