我目前的方法是将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约束到已填充的部分(完成后记得将其返回到池中(。