Объем памяти списка int - PullRequest
2 голосов
/ 08 июня 2011

У меня есть список int, который хранится в БД в виде строки с запятыми между (4345,324,24,2424,64567,33 ...). Эта строка может стать довольно большой и содержать 2-3 тысячи чисел. Он хранится в БД и используется довольно часто.

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

Сколько памяти потребуется для списка 1000 int? Размер памяти также зависит от самого int, так что для хранения большего int (234,332) требуется больше места, чем для меньшего int (544)?

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

Спасибо за ваши предложения.

Ответы [ 6 ]

7 голосов
/ 08 июня 2011

Я думаю, что вы движетесь в неправильном направлении.Хранение в БД, вероятно, будет лучшим вариантом не в формате через запятую, а в виде таблицы значений int.

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

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

Способ, которым вы движетесь:

День №1, 1 пользователь - Хм, если я буду хранить данные в сеансе, почему бы и нет.Должно работать быстро.Нет необходимости запрашивать БД.Это также легко сделать.

День # 10, 5 пользователей - Нужно сохранить другую структуру данных, перенесет это и в сессию, почему бы и нет?Сессия очень быстрая.

День # 50, 10 пользователей - есть элемент управления, который можно рендерить, я сделаю его умным, сделаю рендеринг один раз, а затем добавлю его в сеансиспользуйте его при каждом постбеке.

День # 100, 20 пользователей - Иногда веб-сайт работает медленно, не знаю почему.Но это просто иногда, так что ничего страшного.

День # 150, 50 пользователей - Это медленно.Нужен лучший процессор и память?Нам нужно купить лучший сервер, оборудование старое.

День # 160, 60 пользователей - Получил новый сервер, работает намного быстрее.Проблема решена.

День № 200, 100 пользователей - снова медленно, почему?Это самый новый и самый дорогой сервер!

День № 250, 150 пользователей - пул приложений постоянно перераспределяется.Зачем?OutOfMemoryException?что это?Я буду гуглить.

День # 300, 200 пользователей - пользователи жалуются, мы теряем клиентов.Я читал о WinDbg, нужно попробовать его использовать.

День # 350, 200 пользователей - Если мы начнем использовать балансировку сетевой нагрузки, мы можем купить два сервера!Купленный сервер, попытался использовать, не работал, много зависимостей от сеанса.

День # 400, 200 пользователей - Не удается получить новых клиентов, старые клиенты уходят.Начав использовать WinDbg, выяснил, что почти вся память используется Session.

Day # 450, 200 пользователей - Запуск большого проекта под названием «Избавиться от Session».

День # 500, 250 пользователей - сервер сейчас работает очень быстро.

Я там уже видел это.По сути, мой совет - не ходите по этому пути.

4 голосов
/ 08 июня 2011

Значение int в C # всегда составляет 4 байта (независимо от значения). Таким образом, список из 1000 строк составляет ~ 4000 байтов. Я говорю примерно, потому что структура списка добавит некоторые накладные расходы. Несколько тысяч вставок в списке не должны быть проблемой для современного компьютера.

2 голосов
/ 08 июня 2011

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

1 голос
/ 08 июня 2011

Целые числа имеют фиксированный размер в .NET. Предполагая, что вы храните его в массиве вместо списка (поскольку вы, вероятно, не добавляете и не удаляете из него), это займет примерно 32 бита * число элементов. 1000 дюймов в массиве = примерно 32000 бит или чуть меньше 4 КБ.

0 голосов
/ 08 июня 2011

Является ли этот список int уникальным для сеанса? Если нет, кэшируйте его на уровне сервера и установите срок его действия. 1 копия списка.

context.Cache.Add(...

Я делаю это и обновляю каждые 5 минут большим количеством данных. Таким образом, это довольно «свежо», но только 1 соединение принимает удар, чтобы заполнить его.

0 голосов
/ 08 июня 2011

int обычно занимает 32 бита (4 байта), поэтому 1000 из них занимают около 4 КБ.

Неважно, насколько велико число.Они всегда хранятся в одном и том же месте.

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