C# 整数列表的内存大小

C# 整数列表的内存大小,c#,.net,asp.net,session,.net-4.0,C#,.net,Asp.net,Session,.net 4.0,我有一个int列表,它以字符串的形式存储在数据库中,字符串之间有逗号(4345324,2464567,33…)。这个字符串可能变得相当大,包含2-3千个数字。它存储在数据库中,使用非常频繁 我认为,与其每次需要时都从数据库中读取它,不如在第一次加载后将其存储在会话中 1000 int的列表需要多少内存?内存大小是否也取决于int本身,因此存储较大的int(234332)比较小的int(544)占用更多空间 以内存空间为代价读取一次并存储在会话中会更好,还是经常读取并在渲染后从内存中丢弃会更好 谢

我有一个int列表,它以字符串的形式存储在数据库中,字符串之间有逗号(4345324,2464567,33…)。这个字符串可能变得相当大,包含2-3千个数字。它存储在数据库中,使用非常频繁

我认为,与其每次需要时都从数据库中读取它,不如在第一次加载后将其存储在会话中

1000 int的列表需要多少内存?内存大小是否也取决于int本身,因此存储较大的int(234332)比较小的int(544)占用更多空间

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


谢谢你的建议。

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

在会话中存储数据将显著降低可伸缩性。您可能开始出现OutOfMemory异常,并想知道为什么会发生这种情况

所以我的建议在需要的时候从DB中读取,应用适当的索引,它会非常快

你前进的方向是:

第一天,第一个用户-嗯,我应该在会话中存储数据吗,为什么不呢。应该很快就能完成。不需要查询数据库。也很容易做到

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

第50天,10个用户-有一个控件可以渲染,我会使它智能化,渲染一次,然后放到会话中,在每次回发时重复使用它

第100天,20个用户-有时网站速度慢,不知道为什么。但这只是偶尔,所以没什么大不了的

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

第160天,60个用户——有了一台新服务器,运行速度快得多。问题解决了

第200天,100个用户-又慢了,为什么?这是最新最昂贵的服务器

第250天,150个用户-应用程序池一直在被重新命名。为什么?OutOfMemoryException?这是什么?我会用谷歌搜索

第300天,200个用户-用户抱怨,我们失去了客户。我读过关于WinDbg的文章,需要尝试使用它

第350天,200个用户-如果我们开始使用网络负载平衡,我们可以购买两台服务器!购买了服务器,尝试使用,没有工作,对会话有很多依赖性

第400天,200个用户-无法获得新客户,老客户离开。开始使用WinDbg时,发现几乎所有内存都被会话使用

第#天#450200个用户-开始一个名为“摆脱会话”的大项目

每天有500、250个用户-服务器现在速度太快了


我在那里见过。基本上我的建议是不要这样做。

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

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


不管这个数字有多大。它们总是存储在同一个空间中。

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

我不建议将其存储在会话中,因为这会导致内存压力。如果将一系列整数绑定到单个记录,听起来好像缺少多对一关系-为什么不将整数存储在单独的表中,并使用原始表的外键?

此整数列表对于会话来说是唯一的吗?如果没有,请在服务器级别缓存它并设置过期时间。1份名单副本

context.Cache.Add(...

我这样做,每5分钟用大量数据刷新一次。通过这种方式,它非常“新鲜”,但只有一个连接需要点击来填充它。

对于计算机来说不是这样,但随着应用程序的扩展,会话中增加的4K+开销将开始导致IIS出现问题。如果服务器有16GB的RAM,内存可伸缩性真的会成为问题吗?你认为最终会有多少用户?IIS也没有获得所有16gb的ram。假设我同时拥有1000个用户,那么可伸缩性问题就会迎刃而解。这是第一个构建。在会话中使用该字符串看起来非常诱人:)我倾向于不同意。与存储在数据库中的数据流、缓冲区、I/O成本等相比,内存使用量(大约4K)算不了什么。这可能是一种错误的方法,但不是出于可伸缩性的原因。@Chris Shain无论你得到多少,都要乘以用户数。这是100%的可伸缩性问题。我假设他将在多个用户之间共享同一个阵列。如果不是,正如会话的使用所暗示的那样,那么是的,它不会扩展。但每次使用数组时都不会查询数据库。4K*1000用户是否为4MB?如果服务器有16GB的RAM,那么可伸缩性真的会成为一个问题吗@克里斯,这些数据传输将有多昂贵;如果缺点是1000个用户不断读取的可伸缩性,那么1000个用户的4MB可能是值得的。@Chris Shain-数据库引擎是一个
类型的
保证一定级别可伸缩性的引擎。它被设计用来存储数据和高效地检索数据;根据定义,int总是32位的。它对每个用户都是唯一的,这就是为什么我指的是会话。