簡體   English   中英

從COM流讀取到c#byte []的內存有效方法

[英]memory efficient way to read from COM stream to c# byte[]

我當前的方法是將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();

如果在開始使用之前知道數據的長度,則:您可以分配一個簡單的byte[]並將其填充到您的讀取循環中,只需將每次讀取的偏移量增加為讀取的字節數即可(並減少“數字”允許您觸摸的字節數),但這確實取決於read過載/ API是否接受偏移量或指針。

如果那不是一個選擇: GetBuffer()是最好的選擇-它不會重復數據; 而是將當前可能過大的 byte[]交給您。 因為它過大,所以必須將其與當前.Length結合使用,也許將長度/數據對包裝在ArraySegment<byte>Span<byte> / Memory<byte>

在“長度已知”的情況下,如果您樂於使用超大的緩沖區,則還可以通過ArrayPool<byte>.Shared考慮租用的數組。 ArrayPool<byte>.Shared -租用至少一個該大小的數組,填充它,然后約束您的細分/跨度到填充的部分(完成后,請記住將其返回到池中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM