内存限制

时间:2009-01-22 00:34:35

标签: c# memory

我创建了一个应用程序,用于从一个域复制用户(10,000+),并使用自定义属性在另一个域中创建用户。

该应用似乎运行良好,直到它达到1.7GB的内存,我知道在32位机器上每个进程有2GB的限制,但我在一台带有24GB内存的Windows Server 2008 x64上运行它。 / p>

我的应用程序没有崩溃但在它应该(大约3000个用户)之前完成,也许内存限制不是我的问题,但这是第一件事,当我将应用程序与一个更简单的应用程序进行比较时,这一点很突出因为它循环。

我的项目设置为“任何CPU”,它显示在没有* 32标志的任务管理器中。

任何人都可以帮我理解发生了什么吗?

由于

4 个答案:

答案 0 :(得分:2)

程序中的任何单个数据结构是否超过2千兆字节? .NET运行时可以访问超过2gb,但没有一个对象的大小可以大于2 GB。例如,您不能分配大于2 GB的字节数组。

使用.NET集合时,这可能会让您失望。特别是通用的Dictionary和HashSet集合类型。

在尝试向集合中添加内容时是否会出现内存不足的异常?

答案 1 :(得分:0)

我的大部分应用程序使用DirectorySearcher循环遍历所有10000多个用户,然后为每个DirectoryEntry找到我使用以下内容创建帐户:

using(DirectoryEntry newUser = root.Children.Add("LDAPPATH"))
{
      //Assign properties to the newUser
      newUser.CommitChanges();
      //write the new username to a file using a streamwriter.
}

然后关闭流程图并报告显示已创建的用户数。

我将DirectorySearcher的页面大小设置为110000以获得所有结果。我的应用程序只是完成了它应该只有3500个用户创建的报告。

我使用DirectorySearcher的相同代码创建了一个简单的测试,而不是创建帐户我只是增加一个计数器,计数器达到我预期的数字,所以我认为必须是帐户创建或记录到文件。

答案 2 :(得分:0)

您的记录来源是什么?您是否可以使用连接的DataReader类型模型而不是断开连接的DataTable / DataSet类型模型来避免在内存中保留超过当前记录的数量?

我怀疑你碰巧有一台24GB内存的服务器没有做任何事情。它必须要做一些工作,要求RAM可用于此目的。仅仅因为你在机器上有那么多内存并不一定意味着它可用,或者依靠它是一个好主意。

答案 3 :(得分:0)

你是否应该达到极限,听起来像是你坚持引用一些你并不真正需要的物体。

如果您不知道为什么要消耗这么多内存,您可能需要尝试分析内存使用情况,看看是否真的需要所有内存。有很多选项,但Microsoft CLR Profiler是免费的,可以满足您的需求。