39

我们目前正在考虑构建一个缓存系统来保存从 SQL 数据库中提取的数据,并使其可用于其他几个应用程序(网站、Web 服务等)。我们想象缓存作为 Windows 服务运行,并且基本上由一个保存缓存条目的智能字典组成。我的问题是,应用程序的工作集是否有限制(它将在 windows server 2003 下运行)?还是物理内存的数量是限制?

4

6 回答 6

46

32位还是64位?32bit是2gb(一个进程),64bit是1TB(企业版2003服务器)

但是,即使在 64 位上,CLR 对象的最大大小也是 2gb 。

更新:上述信息在 2008 年是正确的。有关更多最新信息,请参阅Ohad 的回答。Windows 2016 服务器最大可以有24TB

于 2008-10-14T08:15:49.340 回答
23

我最近一直在对 .NET 中 32 位进程的内存限制进行广泛的分析。我们都被我们可以在 .NET 应用程序中分配多达 2.4GB (2^31) 的想法轰炸了,但不幸的是,这不是真的 :(。应用程序进程有这么多的空间可以使用,并且操作系统做得很好然而,为我们管理它的工作,.NET 本身似乎有自己的开销,对于推动内存限制的典型现实世界应用程序来说,这大约占 600-800MB。这意味着,一旦您分配一个整数数组,大约需要1.4GB,您应该会看到 OutOfMemoryException()。

显然,在 64 位中,这个限制发生得更晚(让我们在 5 年后聊聊 :)),但由于字长增加,内存中所有内容的一般大小也会增长(我发现它是 ~1.7 到 ~2 倍)。

我可以肯定的是,操作系统的虚拟内存理念绝对不会在一个进程中为您提供几乎无限的分配空间。只有这样才能将全部 2.4GB 的内存分配给一次运行的所有(许多)应用程序。

于 2009-12-15T22:41:34.580 回答
16

来自MSDN的下表是您查询的最准确答案。请注意,不能直接从托管编译器设置 IMAGE_FILE_LARGE_ADDRESS_AWARE 标志,但幸运的是它可以通过 editbin 实用程序在构建后设置。4GT 指的是 /3gb 标志。

替代文字

于 2010-09-17T21:24:16.643 回答
4

在 32 位 Windows 上,您可以通过使用 /3gb 标志启动 Windows 并将您的应用程序标记为“大地址感知”来获得更多内存

于 2008-10-14T08:27:21.890 回答
1

马蒂亚斯,

实际上不是直接问题的答案,而是解决此问题的另一种方法,它将绕过一些大陷阱,这可能是缓存解决方案的主要问题。(对不起,我没有任何关于此事的推荐读物。)

我们在之前的项目中实现了这一点,但它确实产生了其他问题。

对于离线访问,您可以在桌面上使用 sql express 来创建数据库的镜像(或者只是您需要缓存的位)吗?然后您需要做的就是切换您的应用程序指向的数据库。您甚至可以使用它存储差异并将它们重播到服务器 - 尽管这还有其他问题。您可以更改本地副本的权限,以使其成为只读副本(如果应该是这样的话)。

您正在考虑创建的字典听起来非常像 Sql 索引。如果你能以这种方式构建它,我会依靠 sql 为你完成这项工作。为什么要重新发明那个轮子?如果你这样做了,你将不得不仔细考虑缓存过期和内存管理——特别是如果这是一个 Windows 服务。

祝你好运,

山姆

于 2008-10-15T15:01:30.377 回答
0

与任何其他 Windows 程序一样,您受到地址空间的限制。即:在 32 位上,您可以拥有 2GB 的地址空间。在 x64 上,您可以拥有 8TB。

如果您没有 8TB 的物理内存,它将开始分页。

于 2008-10-14T08:15:00.323 回答