Есть ли строковый тип с 8 битными символами? - PullRequest
1 голос
/ 07 февраля 2011

Мне нужно хранить много строк в оперативной памяти.Но они не содержат специальных символов Юникода, все они содержат только символы из «ISO 8859-1», что составляет один байт.

Теперь я могу преобразовать каждую строку, сохранить ее в памяти и преобразовать обратно, чтобы использовать еес .Contains () и подобными методами, но это будет непроизводительно (по моему мнению) и медленно.

Есть ли строковый класс, который быстр и надежен и предлагает некоторые методы исходного строкового класса, например.Contains ()?

Мне нужно это, чтобы хранить больше строк в памяти с меньшим объемом используемой оперативной памяти.Или есть другой способ сделать это?

Обновление:

Спасибо за ваши комментарии и ваш ответ.

У меня есть класс, в котором хранится строка.Затем с помощью одного вызова метода мне нужно выяснить, есть ли у меня эта строка в памяти.У меня есть около 1000 строк, чтобы выяснить , если они есть в списке в секунду .Всего сто миллионов.Средний размер строки составляет около 20 символов.Меня действительно волнует оперативная память.

Я даже думал о сжатии нескольких миллионов строк и сохранении этих пакетов в памяти.Но затем мне нужно распаковывать его каждый раз, когда мне нужен доступ к значениям.

Я также пытался использовать HashSet, но необходимый объем памяти был еще выше.

Мне не нужноистинное значение.Просто чтобы узнать, есть ли значение в списке.Так что, если есть хэш-значение, которое может это сделать, даже лучше.Но все, что я нашел, требует больше памяти, чем чистая строка.

В настоящее время нет плана дальнейшей интернационализации.Так что с этим я бы столкнулся, когда пришло время: -)

Я не знаю, решит ли это использование базы данных.Мне не нужно ничего извлекать, просто чтобы узнать, хранилось ли значение в классе.И мне нужно сделать это быстро.

Ответы [ 3 ]

6 голосов
/ 07 февраля 2011

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

  • Чтобы преобразовать string в byte[] для этой цели, используйте Encoding.Default.GetBytes() [1] .

  • Чтобы преобразовать byte[] обратно в string для отображения или другой обработки на основе строк, используйте Encoding.Default.GetString().

  • Вы можете сделать свой код лучше, если вы используете методы расширения, определенные в string и byte[]. Кроме того, вы можете обернуть byte[] в оболочку и поместить туда методы. Сделайте эту обертку типа struct, а не class, в противном случае это приведет к дополнительному выделению кучи, чего вы пытаетесь избежать.

Я хочу предупредить вас - вы отказываетесь от возможности использовать Unicode в своем приложении. Обычно вы должны включать все сигналы тревоги каждый раз, когда вам кажется, вам нужно сделать это. Лучше всего, если вы структурируете свой код таким образом, что вы легко сможете вернуться к использованию string, когда объемы памяти увеличатся и потребление памяти перестанет быть проблемой.


[1] Encoding.Default возвращает текущую 8-битную кодовую страницу работающей операционной системы. По умолчанию для этого на англоязычной Windows - Windows-1252, что вам и нужно. Для русской Windows это будет Windows-1251 (кириллица) и т. Д.

3 голосов
/ 07 февраля 2011

Согласно комментариям, в основном плохая идея. Если вам нужно это сделать, байт [] - ваш друг. В .NET нет байтового класса строк.

1 голос
/ 07 февраля 2011

Извлеките метод string.Intern, который может вам помочь:

http://www.yoda.arachsys.com/csharp/strings.html

http://en.csharp -online.net / CSharp_String_Theory% E2% 80% 94String_intern_pool

Как бы то ни было, учитывая ваши требования, я думаю, что вы перестали его разрабатывать У вас есть 1000 строк в 20 символов = 1000 * 20 * 2 = 40000 байт, это не так много памяти.

Если у вас действительно большое количество, сохраните его в БД с индексом. Это было бы намного быстрее, чем все, что может придумать обычный программист.

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