.NET строки против потоков - профиль памяти и характеристики - PullRequest
6 голосов
/ 29 декабря 2008

Мне нужно извлечь большие текстовые строки Unicode (например, 200Mb) из базы данных (nvarchar) и сохранить в памяти для обработки. то есть мне нужен произвольный доступ ко всем частям строк.

Рассматривая это с точки зрения строго памяти, каковы преимущества и недостатки использования System.IO.MemoryStream по сравнению с System.String в качестве представления в памяти.

Вот некоторые факторы, которые я пытаюсь исследовать:

  • Как эти объекты действуют в [гипотетической] сильно фрагментированной среде с малой памятью
  • Неизменность
  • Фактический размер в памяти (если поток UTF8, мы почти размер в два раза)
  • Есть ли другой объект, о котором я не думал?

Я ищу ясности и совета по этим вопросам, а также любые другие вопросы памяти, о которых я не задумывался?

Примечание: может быть лучший способ обработки этих строк, но на данный момент я просто спрашиваю о том, как память хранит такой объект.

Ответы [ 2 ]

5 голосов
/ 29 декабря 2008

Рассматривая это с точки зрения строго памяти, каковы преимущества и недостатки использования System.IO.MemoryStream по сравнению с System.String в качестве представления в памяти.

Вот некоторые факторы, которые я пытаюсь исследовать:

  • Как эти объекты действуют в [гипотетической] сильно фрагментированной среде с малой памятью

IMO, MemoryStream полезен только тогда, когда кодировка тривиальна (например, ASCII, ISO-8859-X и т. Д.). Если кодировка UTF-8 и , у вас есть символы не ASCII, тогда обработка станет более сложной. Конечно, MemoryStream почти наверняка будет потреблять меньше памяти, но в остальном разницы нет. Под капотом MemoryStream используется байтовый массив, который также должен быть размещен в непрерывной части памяти.

  • Фактический размер в памяти (если поток равен UTF8, мы почти вдвое сократили размер)

Правильно, с чисто ASCII-символами MemoryStream будет потреблять половину того, что потребляет эквивалентная строка.

  • Есть еще один объект, о котором я не думал?
List<byte> // has a nicer interface for processing

Как строки хранятся в базе данных? varchar или nvarchar?

С уважением,

Andreas

4 голосов
/ 29 декабря 2008

Память строки против потока довольно несущественна. Строки - это utf-16, поэтому может включать небольшое кратное число, но из-за задействованных томов вам, вероятно, лучше записать данные в рабочий файл.

Чтобы прочитать данные из базы данных, используйте методы потоковой передачи; то есть использовать IDataReader (ExecuteReader) с ним в последовательном режиме и читать куски байтов / символов. Не пытайтесь прочитать весь столбец.

Кроме того, в SQL Server 2008 вам не нужно смотреть на тип файлового потока.

Примеры:

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