2009-06-12 4 views
8

При использовании MemoryStream я часто копирую (следовательно, дублирую) данные во временный массив байтов.MemoryStream vs массив байтов

Я думаю, что это немного пустая трата ресурсов, потому что MemoryStream не позволяет напрямую обращаться к базовому массиву байтов.

В этой ситуации, что является реальным преимуществом MemoryStream? Я где-то читал, что он работает как файл с отображением памяти. Данные приводятся с диска только при доступе, потребляя меньше памяти.

Это правда? Я так не думаю. Может быть, это имеет место для FileStream?

Благодарим вас за разъяснение.

+2

На каком языке и в библиотеке это используется? – thecoop

+0

C# - .net framework. – 2009-06-12 17:40:41

ответ

4

Для меня основным преимуществом потока памяти является то, что он динамически растет и оптимизирован для этого. Это is боль, которую нужно скопировать и продублировать память, но если вы используете ее главным образом для создания буфера, который будет передан в конце процесса, этот недостаток амортизируется несколько.

Я должен добавить, в отличие от FileStream, MemoryStreams намного быстрее. Они более ограничены по размеру, чем FileStreams, потому что у вас обычно намного больше дискового пространства, чем RAM. Поэтому вам нужно решить, нужна ли вам скорость или пространство.

+0

Ну, в обоих случаях (MemoryStream или FileStream) методы чтения и записи принимают целое число для смещения и подсчета. Поэтому я думаю, что они могут подняться до того же размера. – 2009-06-12 17:43:48

+0

Они теоретически могут, но помните, что MemoryStream хранится в памяти, поэтому, когда ОЗУ заполнено, оно начинается с страницы, и это приведет к замедлению работы приложения, и через некоторое время происходит замедление работы системы (из-за того, что RAM и страница заполнены). –

+0

Да, одна забавная вещь, которую я заметил, это то, что свойство Length потока длинное (8 байтов). Вы даже не можете ссылаться на файл с большими методами чтения и записи. Я уверен, что это как-то связано с родным API win32. – 2009-06-12 18:28:05

3

Вы можете получить основной буфер байтов с использованием функции getBuffer (но только если вы создали MemoryStream из массива байтов, который вы указали, что полезно, если вы хотите, чтобы быть в состоянии управлять буфером непосредственно)

Единственное преимущество использования MemoryStream заключается в том, что вы используете API, основанный на потоках, если вам нужен бут-буфер для динамического роста.

+1

«только если ... из массива байтов, который вы предоставили», неверно. Проверьте [документы] (http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx): Возвращает 'Массив байтов, из которого был создан этот поток, или базовый массив if массив байтов не был предоставлен конструктору MemoryStream во время построения текущего экземпляра. Фактически, если вы предоставите массив при построении и хотите, чтобы «GetBuffer» возвращал его, вам нужно использовать перегрузку конструктора с флагом 'publiclyisisible' и установите значение 'true', иначе вы получите' UnauthorizedAccessException'. –

Смежные вопросы