将字节数组转换为内存流和位图会导致大量内存使用

时间:2019-07-03 13:38:58

标签: c# wpf memory-leaks out-of-memory heap-memory

我有一个字节数组列表。而且,我正在使用它通过内存流生成位图图像。

保存图像时,内存使用率很高。在某些时候,它会导致内存不足异常。

我试图注释掉保存文件,以查看是否导致此问题。或者,手动调用GC。什么都没改变,仍然使用高内存。我最新的代码是这样的:

List<byte[]> byteArrayList = helper.GetArrayList(); // Gets approximately 10k items.

for (int i = 0; i < byteArrayList.Count; i++)
{
    using (MemoryStream ms = new MemoryStream(byteArrayList[i]))
    {
        using (Bitmap bm = new Bitmap(ms))
        {
            bm.Save(fileLocation);

            bm.Dispose();
        }

        ms.Dispose();
    }

    byteArrayList[i] = null;

    byteArrayList.Remove(byteArrayList[i]);
}

byteArrayList.Dispose();

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

如果您更改了辅助方法,则改为返回Queue<T> ...

Queue<byte[]> byteArrayQueue = helper.GetQueue(); // Gets approximately 10k items.

while (byteArrayQueue.Any())
{
    using (var ms = new MemoryStream(byteArrayQueue.Dequeue()))
    {
        using (var bm = new Bitmap(ms))
        {
            bm.Save(fileLocation);
        }
    }
}

答案 1 :(得分:0)

我已经测试了您的代码,发现系统无法在LOOP中收集您的垃圾。因此,如果您在一个循环中创建了很多位图,则内存将增加到峰值级别(例如2-3-4 gbs),直到运行垃圾收集器。但是当循环结束时,内存级别降低到正常水平,为时已晚。因此,当我在BackgroundWORKER(而不是主线程)中测试您的代码时,GC不会停留在循环中并按预期运行,它将字节数组转换为位图并保存它们而没有任何极端的内存消耗。