Давайте предположим, что у нас есть простой интернет-сокет, и он собирается отправить 10 мегабайтов (потому что я хочу проигнорировать проблемы памяти) случайных данных через. Есть ли какое-либо различие в производительности или метод лучшей практики, который нужно использовать для получения данных? Данные окончательного результата должны быть представлены байтом []. Да я знаю запись, что произвольный объем данных к памяти плох, и если бы я загружал большой файл, то я не сделал бы его как это. Но поскольку польза аргумента позволяют нам проигнорировать, что и предполагают, что это - небольшой объем данных. Я также понимаю, что узкое место здесь является, вероятно, не управлением памятью, а скорее получением сокета. Я просто хочу знать то, что было бы наиболее эффективным способом получения данных.
Несколько изворотливых путей могут думать:
Имейте Список и буфер, после того, как буфер полон, добавьте его к списку и в списке конца. ToArray () для получения байта []
Запишите буфер в поток памяти после его полной конструкции байт [] потока. Длина и считала все это в него для получения байта [] вывод.
Существует ли более эффективный/лучше способ сделать это?
Просто напишите в MemoryStream
, а затем вызовите ToArray
- это создаст объект подходящего размера байтовый массив для вас. По сути, это то, на что в любом случае будет похож List
, но использование MemoryStream
будет намного проще.
Вы можете записать в поток памяти, а затем использовать средство чтения потоков или что-то в этом роде для получения данных. Что ты делаешь с данными? Я спрашиваю, потому что с точки зрения памяти было бы более эффективно записывать входящие данные в файл или таблицу базы данных по мере их получения, а не хранить все содержимое в памяти.
Какова кодировка ваших данных? это простой ASCII или что-то еще, например UTF-8 / Unicode?
если это простой ASCII, вы можете просто выделить StringBuilder () требуемого размера (получить размер из заголовка ContentLength ответа ) и продолжайте добавлять свои данные в построитель после преобразования их в строку с помощью Encoding.ASCII.
Если это Unicode / UTF8, то у вас проблема - вы не можете просто вызвать Encoding..GetString (buffer, 0, bytesRead) для прочитанных байтов, потому что bytesRead может не составлять фрагмент логической строки в этой кодировке. В этом случае вам нужно будет поместить в буфер все тело объекта в память (или в файл), затем прочитать этот файл и декодировать его, используя кодировку.