如何使用.Net中的Streams解包数据而不复制数据

问题描述 投票:0回答:1

我有这个继承的代码:

private string DecompressData(byte[] data)
{
    byte[] decompressedData;
    using (MemoryStream ms = new MemoryStream(data))
    {
        using (GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress))
        {
            using (MemoryStream resultStream = new MemoryStream())
            {
                gzip.CopyTo(resultStream);
                decompressedData = resultStream.ToArray();
            }
        }
    }

    return Encoding.UTF8.GetString(decompressedData);
}

数据数组最大可达1Mb,压缩比可达32倍。然而,我发现此方法的内存使用量大幅增加(有时约为 100Mb)。这是容器任务的一部分,我试图尽可能并行化以充分利用每个容器,但目前看到 OOM 错误。如何重写此代码,以便在下一个流读取输入数据时将其处理掉?或者我可以采取什么不同的方法以更有效的内存方式完成相同的任务?

c# .net optimization memory-management
1个回答
0
投票

可以尝试这样的方法来看看它是否使用更少的内存:

private string DecompressData(byte[] data)
{
    using (MemoryStream ms = new MemoryStream(data))
    using (GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress))
    using (StreamReader reader = new StreamReader(gzip, Encoding.UTF8))
    {
        // Read directly from the GZipStream and decode into a string
        return reader.ReadToEnd();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.