【问题标题】:Memory Limits内存限制
【发布时间】:2009-01-22 00:34:35
【问题描述】:

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

该应用程序在达到 1.7gb 内存之前似乎运行良好,我知道 32 位机器上每个进程的限制为 2gb,但我在具有 24gb RAM 的 Windows Server 2008 x64 副本上运行它。

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

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

谁能帮我理解发生了什么?

谢谢

【问题讨论】:

    标签: c# memory


    【解决方案1】:

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

    这可能会让您在使用 .NET 集合时感到困惑。特别是通用 Dictionary 和 HashSet 集合类型。

    在尝试向集合添加内容时,您是否遇到内存不足异常?

    【讨论】:

    • 另外,如果我错了,请纠正我,但 .NET 运行时不仅不能为每个对象分配超过 2 GB 的空间,它还需要将一个对象放入连续的内存块中,所以有时甚至 2 GB 也可能是不可能的,但我对此并不完全确定。 Jon Skeet 可以对此有所了解:)
    • 你是对的。您需要一个连续的内存块,因此在 32 位系统上您不太可能接近 2 GB。还有一些分配开销。例如,您可以分配的最大字节 [] 是 2,147,483,591 字节。 (实验结果。)
    【解决方案2】:

    我的大部分应用程序正在使用 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.
    }
    

    然后我关闭 streamwriter 并报告显示已创建的用户数。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 不是很好,因为问题是关于内存限制的。他正试图了解为什么他当前的实现不起作用。
      【解决方案4】:

      无论您是否应该达到限制,在我看来,您都在持有对一些您并不真正需要的对象的引用。

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

      【讨论】:

        猜你喜欢
        • 2010-09-26
        • 2014-07-16
        • 2011-02-25
        • 2012-01-04
        • 2017-11-29
        • 2016-12-21
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多