【问题标题】:C# .NET Linq Memory Cleanup or Leak?C# .NET Linq 内存清理或泄漏?
【发布时间】:2010-11-13 12:03:18
【问题描述】:

我有一个 2GB 的大文件,其中包含 150 万个列表要处理。我正在运行一个控制台应用程序,它执行一些字符串操作,然后将每个列表上传到数据库。

  1. 我创建了一个 LINQ 对象并通过将其分配给每个列表(循环)的新 LinqObject() 来清除该对象。

  2. 对象完成后,我将其添加到列表中。

  3. 当列表达到100个对象时,我对整个列表提交All,清空列表,然后重复。

随着程序的运行,我的内存使用量继续增长。我应该做些什么来降低内存使用量?我试过 GC.collect。我想我想使用 dispose..

提前感谢您的关注。

【问题讨论】:

  • 是的,我需要保持较低的内存使用率。仅 10 万个列表后,它就增长到 350 mb。我第一次运行它时没有检查内存使用情况,程序锁定在 110 万个列表。内存使用量可能远远超过 1GB
  • 使用内存分析器查找问题;这就是它的用途。
  • 你能发布一些代码来说明你在做什么吗?

标签: c# .net memory garbage-collection dispose


【解决方案1】:

程序运行时内存使用量增加是正常的。您不应该试图强制垃圾收集器减少内存使用来尝试节省资源,这很可能会浪费资源。

与人们的第一反应相反,只要还有空闲内存,高内存使用就不是性能问题。拥有大量未使用的内存并不会提高性能。如果您尝试减少内存使用量只是为了降低内存使用量,那么您只是在浪费 CPU 时间进行不需要的清理。

如果您的可用内存不足或其他应用程序需要它,垃圾收集器将进行适当的清理。几乎在所有情况下,垃圾收集器对当前内存情况的了解都比您在编写代码时所能预料的要多。

如果您正在使用实现 IDisposable 接口的对象,则应调用 Dispose 方法来释放非托管资源,但所有其他对象都由垃圾收集器处理。托管对象通常根本不会泄漏内存。

【讨论】:

    【解决方案2】:

    内存使用量增长了多少? .NET 可能只是有效地“解决”。

    目前还不清楚你是如何做到这一点的,但一般原则听起来不错。我建议您将数据库工作排除在外 - 只需注释掉实际提交给数据库的任何行。查看使用了多少内存。除了StreamReader(或其他)之外,如果您不接触数据库,您不应该有任何其他需要处理的东西 - 只需构建一批转换后的对象并将它们扔掉。

    【讨论】:

    • 是的,我正在使用 StreamReader。但是,我真的把这些东西扔掉了吗?提交后,我在列表中使用 .clear() 。我声明了一次 linq 对象,然后通过声明 new SomeLinqObject(); 为每个对象覆盖它;
    • 感谢您的建议。在未提交到数据库的情况下,500k 个列表后内存分配增长到 1GB。
    • 我实际上会创建一个新列表而不是清除旧列表,但它应该没问题。我对内存分配感到惊讶......你能发布一些示例代码吗?
    【解决方案3】:

    需要你的内存使用量保持低吗?如果没有实际的功能问题,高内存使用本身就不是问题。

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 2022-12-06
      • 2021-07-13
      • 2016-05-31
      • 2013-08-27
      • 1970-01-01
      • 2011-03-22
      • 2014-04-23
      相关资源
      最近更新 更多