我继承了一些执行以下步骤的代码:
- 从压缩数据的字节数组开始,对其进行流式传输和解压缩
- 将其反序列化为对象列表
- 添加至列表
- 序列化列表
- 将数据重新压缩为字节数组
private static readonly RecyclableMemoryStreamManager MemoryStreamManager = new RecyclableMemoryStreamManager();
static async Task Main(string[] args)
{
using (FileStream fileStream = new FileStream("C:\\data.txt", FileMode.Open, FileAccess.Read))
{
var dataList = await DecompressData(fileStream);
dataList.Add(new MyObject { });
using(var stream = MemoryStreamManager.GetStream())
{
await JsonSerializer.SerializeAsync(stream, dataList);
stream.Position = 0;
var b = await CompressData(stream);
}
}
Console.WriteLine("All done");
}
private static async Task<List<SipTraceRecord>> DecompressData(Stream data)
{
using (var resultStream = MemoryStreamManager.GetStream())
{
GZipStream gzip = new GZipStream(data, CompressionMode.Decompress);
List<SipTraceRecord> recordsList = await JsonSerializer.DeserializeAsync<List<MyObject>>(gzip);
return recordsList;
}
}
private static async Task<byte[]> CompressData(Stream data)
{
byte[] compressedData;
using (var ms = MemoryStreamManager.GetStream())
{
using (GZipStream gzip = new GZipStream(ms, CompressionMode.Compress))
{
data.CopyTo(gzip);
compressedData = ms.GetBuffer();
}
}
return compressedData;
}
这与代码开始时有很大不同,我只是试图尽可能地优化内存。测试输入文件为 600Kb,解压后为 22Mb,之前它使用 100Mb 的内存。现在内存已降至 90Mb。内存使用率高的区域仍然存在,例如await JsonSerializer.SerializeAsync(stream, dataList);
使用 10Mb 将数据写入流。这是否可以像在其他方向上一样进行优化,其中没有字节数组,只是根据需要进行流式传输?
这data.CopyTo(gzip);
也是重复的数据,但此时数据已被压缩,因此仅使用<1Mb