【问题标题】:memory efficient way to read from COM stream to c# byte[]从 COM 流读取到 c# byte[] 的内存有效方式
【发布时间】:2018-11-30 11:29:50
【问题描述】:

我目前的方法是将 COM 流读入 C# MemoryStream,然后调用 .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();

【问题讨论】:

    标签: c# memory stream memorystream


    【解决方案1】:

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

    如果这不是一个选项:GetBuffer() 是您最好的选择 - 它不会重复数据;而是给你当前的可能超大byte[]。因为它是超大的,所以您必须结合当前的.Length 考虑它,也许将长度/数据对包装在ArraySegment<byte>Span<byte>/Memory<byte> 中。

    在“长度已知”的场景中,如果您乐于使用超大缓冲区,您还可以考虑通过ArrayPool<byte>.Shared 租用一个 数组 - 租用其中一个 至少那个大小,填充它,然后将你的段/跨度限制在填充的部分(并记住在完成后将它返回到池中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多