эффективный способ чтения из потока COM в c # byte [] - PullRequest
0 голосов
/ 30 ноября 2018

Мой текущий подход заключается в чтении 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();

1 Ответ

0 голосов
/ 30 ноября 2018

Если вам известна длина данных до того, как вы начнете их использовать, то: вы можете выделить простое byte[] и заполнить его в цикле чтения, просто увеличивая смещение каждого чтения на количество прочитанных байтов (и уменьшая его).ваше "число байтов, к которым вы можете прикоснуться). Это делает зависящим от наличия read перегрузки / API, который принимает либо смещение, либо указатель.

Если этоне вариант: GetBuffer() - ваша лучшая ставка - она ​​не дублирует данные, скорее, она вручает вам текущий возможно слишком большой byte[]. Поскольку он слишком большой, вы должны рассмотреть его вкомбинации с текущим .Length, возможно, оборачивая пару длина / данные либо в ArraySegment<byte>, либо в Span<byte> / Memory<byte>.

В сценарии «длина известна», если выЕсли вы готовы работать с большими буферами, вы также можете рассмотреть арендованный массив через ArrayPool<byte>.Shared - арендуйте один из по крайней мере этого размера, заполните его, затем ограничьте ваш сегмент /охватывают населенную часть (аи не забудьте вернуть его в бассейн, когда закончите).

...