2010-07-30 4 views
4

Планирование структуры данных для хранения временных двоичных данных в памяти для анализа.какая структура данных хороша для временного большого двоичного хранения данных?

Максимальный размер данных будет около 10MB.

данные будут добавлены в конце 408 bytes за раз.

не искать, извлекать операции по этим временным двоичным данным.

данные будут уничтожены, и хранилище будет повторно использовано для последующего анализа.

вопросы:

  1. , в состав которого хорошо для этой цели? byte[10MB], List<bytes>(10MB), List<MyStruct>(24000), or ...?
  2. как быстро стереть данные (не List.Clear(), просто установить значение 0) для списка или массива?
  3. Если я говорю List.Clear(), память для этого List сожмет или емкость (память) из списка по-прежнему существует и никакого распределения памяти, когда я звоню List.AddRange() после Clear()?
  4. List.Insert() не сделает список больше или просто заменить существующий элемент?
+0

О каких «операциях получения» мы говорим? Обработка отдельных блоков из 408 байт? –

+0

означает получение данных из середины данных – 5YrsLaterDBA

+0

Но как вы намереваетесь это сделать? Можете ли вы описать, какой «анализ» вы собираетесь делать? –

ответ

0

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

Создайте байт [] и введите int, чтобы вы знали, где заканчивается «полная» часть этого буфера, и начинается «бесплатная» часть. Вам никогда не нужно его очищать; просто перепишите то, что было там. Единственная проблема заключается в том, что иногда ваши данные составляют 100 кб, иногда 10 МБ, а иногда немного больше, чем планировалось раньше.

Список будет медленнее использовать и больше в памяти, хотя они обрабатывают различные размеры данных из коробки.

+0

Размер не всегда одинаковый – 5YrsLaterDBA

+0

Если он всегда находится в одном и том же месте, это все еще работает очень хорошо; если вы всегда смотрите на 5-10 мегабайт и не более 10 мегабайт, дайте себе буфер размером 10 мегабайт. –

0
using (System.IO.MemoryStream memStream = new System.IO.MemoryStream()) 
{ 
    Do stuff 
} // the using ensures proper simple disposal occurs here so you don't have to worry about cleaning up. 
+0

В правиле существует определенная логика: если она реализует IDisposable, утилизируйте ее. Но иногда нам разрешается использовать наши мозги. Цель IDisposable состоит в том, чтобы отказаться от * внешних * ресурсов задолго до того, как GC опустится, чтобы освободить память. Какие внешние ресурсы вы себе представляете, что MemoryStream имеет? Я дам вам ответ: Нет. – Tergiver

1

Вы должны описать то, что вы делаете больше, чтобы дать лучшие ответы, но это звучит, как вы беспокоитесь об эффективности/перфорация так

  1. байт []
  2. нет необходимости в очистить массив, просто отслеживать, где «конец» вашего текущего цикла
  3. н/
  4. н/
Смежные вопросы