从COM流到c#byte[]的高效内存读取方式



我目前的方法是将COM流读取到C#内存流中,然后调用.toArray。但是,我认为toArray会创建数据的冗余副本。有没有更好的方法将减少内存使用作为优先级?

var memStream = new MemoryStream(10000);
var chunk = new byte[1000];
while (true)
{
int bytesRead = comStream.read(ref chunk, chunk.Length);
if (bytesRead == 0)
break; // eos
memStream.Write(chunk, 0, bytesRead);
}
//fairly sure this creates a duplicate copy of the data
var array = memStream.ToArray();
//does this also dupe the data?
var array2 = memStream.GetBuffer();

如果在开始使用数据之前就知道数据的长度,然后:您可以分配一个简单的byte[],并通过用读取的字节数增加每次读取的偏移量(并减少您允许触摸的字节数(将其填充到读取循环中。不过,这确实取决于是否有接受偏移量或指针的read重载/API。

如果这不是一个选项:GetBuffer()是你的最佳选择——它不会复制数据;相反,它会向您提供当前的可能过大的byte[]。由于它过大,您必须将其与当前的.Length结合起来考虑,可能会将长度/数据对封装在ArraySegment<byte>Span<byte>/Memory<byte>中。

在"长度已知"的情况下,如果您愿意使用超大缓冲区,您也可以考虑通过ArrayPool<byte>.Shared租用阵列-租用至少该大小的中的一个,填充它,然后将您的段/span约束到已填充的部分(完成后记得将其返回到池中(。

最新更新