int列表的内存大小

时间:2011-06-08 02:22:29

标签: c# .net asp.net session .net-4.0

我有一个int列表,它以字符串的形式存储在DB中,其间有逗号(4345,324,24,2424,64567,33 ...)。这个字符串可能会变得非常大,包含2-3千个数字。它存储在数据库中并经常使用。

我想的是,不是每次需要时都从DB中读取它,最好在第一次加载后将它存储在会话中。

1,000 int列表需要多少内存?内存大小是否也依赖于int本身,这样存储较大的int(234,332)比较小的int(544)占用更多的空间?

以内存空间为代价读取一次并存储在会话中会更好,或者更好地经常阅读并在渲染后从内存中丢弃。

感谢您的建议。

6 个答案:

答案 0 :(得分:7)

我认为你正走向错误的方向。存储在DB中可能是更好的选择,不是以逗号分隔格式,而是作为int值表。

在会话中存储数据会显着降低可扩展性。你可能会开始有OutOfMemory异常,并想知道为什么会这样。

所以我的建议是在需要时从数据库读取,应用适当的索引,它会非常快。

你前进的方式是:

第1天,1位用户 - 嗯,我应该在Session中存储数据,为什么不呢。应该快速工作。无需查询DB。也很容易做到。

第10天,5位用户 - 需要存储另一个数据结构,也会把它放到会话中,为什么不呢?会话非常快。

Day#50,10个用户 - 有一个控制器可以渲染,我会让它变得智能,渲染一次而不是放到Session中,将在每次回发时重复使用它。 < / p>

第100天,20位用户 - 有时网站速度慢,不知道为什么。但有时候,这不是什么大问题。

第150天,50位用户 - 速度很慢。需要更好的CPU和内存?我们需要购买更好的服务器,硬件很旧。

第160天,60位用户 - 拥有一台新服务器,工作速度更快。问题解决了。

Day#200,100位用户 - 再次放慢,为什么?这是最新的最昂贵的服务器!

Day#250,150位用户 - 应用程序池一直在重新启动。为什么? OutOfMemoryException异常?这是什么?我会google。

Day#300,200位用户 - 用户抱怨,我们失去了客户。我读到了WinDbg,需要尝试使用它。

Day#350,200位用户 - 我们是否应该开始使用网络负载平衡,我们可以购买两台服务器!买了服务器,试图使用,没用,很多依赖于Session。

Day#400,200位用户 - 无法获得新客户,老客户消失。开始使用WinDbg发现几乎所有内存都被Session使用。

Day#450,200位用户 - 启动一个名为“摆脱会话”的大项目。

Day#500,250位用户 - 服务器现在非常快。

我去过那儿。基本上我的建议 - 不要这样。

答案 1 :(得分:4)

C#中的int总是4个字节(无论值是多少)。因此,1,000个整数的列表约为4,000个字节。我说大概是因为列表结构会增加一些开销。列表中的几千个整数不应该是现代计算机的问题。

答案 2 :(得分:2)

我不建议将其存储在会话中,因为这会导致内存压力。如果你有一系列整数绑定到一个记录,听起来你错过了多对一关系 - 为什么不将int存储在一个带有原始表的外键的单独表中呢?

答案 3 :(得分:1)

整数在.NET中具有固定大小。假设您将它存储在数组而不是List中(因为您可能不会添加或删除它),它将占用大约32位*元素的数量。数组中的1000个int =大约32000位,或者略低于4 KB。

答案 4 :(得分:0)

int通常需要32位(4个字节),因此其中1000个大约需要4KB。

数量有多大并不重要。它们总是存放在同一个空间中。

答案 5 :(得分:0)

这个int的列表对于会话是唯一的吗?如果没有,请在服务器级别缓存它并在其上设置到期日期。列表的1份副本。

context.Cache.Add(...

我这样做并且每5分钟用大量数据刷新它。这种方式非常“新鲜”,但只有一个连接需要命中才能填充它。