【问题标题】:Exception of type 'System.OutOfMemoryException' was thrown in C#在 C# 中引发了“System.OutOfMemoryException”类型的异常
【发布时间】:2011-10-10 18:56:48
【问题描述】:
HtmlHelper.GetTagsAndValues(htmlContent);

我得到这个错误:

 at System.String.Split(String[] separator, Int32 count, StringSplitOptions options)
   at System.String.Split(String[] separator, StringSplitOptions options)
   at WebCrawler.Logic.CrawlerManager.UseRulesOnHtmlPage(Agencies agency, String pageUrl, List`1 listTagValuePair, RulesGroups ruleGroup) in D:\PROJEKTI\crawler\WebCrawlerSuite\WebCrawler.Logic\CrawlerManager.cs:line 263
   at WebCrawler.Logic.CrawlerManager.GetAdvertismentFromHtmlContent(List`1 listTagValuePair, Agencies agency, String pageUrl) in D:\PROJEKTI\crawler\WebCrawlerSuite\WebCrawler.Logic\CrawlerManager.cs:line 191
   at WebCrawler.Logic.CrawlerManager.ImportAdvertisment2Database.Work(Crawler crawler, PropertyBag propertyBag) in D:\PROJEKTI\crawler\WebCrawlerSuite\WebCrawler.Logic\CrawlerManager.cs:line 668
   at WebCrawler.Logic.CrawlerManager.ImportAdvertisment2Database.Process(Crawler crawler, PropertyBag propertyBag) in D:\PROJEKTI\crawler\WebCrawlerSuite\WebCrawler.Logic\CrawlerManager.cs:line 584

我读了这篇文章:

http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

我怎样才能防止这个错误?

整个方法:

public static List<TagValuePair> GetTagsAndValues(string htmlContent)
        {
            List<TagValuePair> tagsValues = new List<TagValuePair>();
            Dictionary<string, int> tagAppearance = new Dictionary<string, int>();

            HtmlDocument doc = new HtmlDocument();

            if (htmlContent != null)
            {
                doc.LoadHtml(htmlContent);

                if (doc.DocumentNode.SelectNodes("//*") == null)
                {
                    List<TagValuePair> tempList = new List<TagValuePair>();
                    tempList.Add(new TagValuePair("Error!", htmlContent, -1));
                    return tempList;
                }

                foreach (HtmlNode tag in doc.DocumentNode.SelectNodes("//*"))
                {
                    try
                    {
                        if (!string.IsNullOrEmpty(tag.InnerHtml.Trim()))
                        {
                            if (!tagAppearance.Keys.Contains(tag.Name))
                            {
                                tagAppearance.Add(tag.Name, 1);
                            }
                            else
                                tagAppearance[tag.Name] = tagAppearance[tag.Name] + 1;

                            tagsValues.Add(new TagValuePair(tag.Name, tag.InnerHtml.Trim(), tagAppearance[tag.Name]));
                        }
                        else
                        {
                            // Help link: http://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.html
                            if (!string.IsNullOrEmpty(tag.GetAttributeValue("value", "").Trim()))
                            {
                                if (!tagAppearance.Keys.Contains("option value"))
                                {
                                    tagAppearance.Add("option value", 1);
                                }
                                else
                                    tagAppearance["option value"] = tagAppearance["option value"] + 1;

                                tagsValues.Add(new TagValuePair("option value", tag.GetAttributeValue("value", "").Trim(), tagAppearance["option value"]));
                            }

                            if (tag.NextSibling != null && !string.IsNullOrEmpty(tag.NextSibling.InnerHtml.Trim()))
                            {
                                if (!tagAppearance.Keys.Contains(tag.Name))
                                {
                                    tagAppearance.Add(tag.Name, 1);
                                }
                                else
                                    tagAppearance[tag.Name] = tagAppearance[tag.Name] + 1;

                                tagsValues.Add(new TagValuePair(tag.Name, tag.NextSibling.InnerHtml.Trim(), tagAppearance[tag.Name]));
                            }
                        }
                    }
                    catch (Exception)
                    {
                        return null;
                    }
                }
            }

编辑:

确切的错误在这里:

 doc.LoadHtml(htmlContent);

【问题讨论】:

  • 你应该重新组织你的代码。 “全局” System.Exception Catcher 不是一个好主意。删除 catch 时,您可以看到抛出异常的确切位置。另见blogs.msdn.com/b/kcwalina/archive/2007/01/30/…
  • 谢谢。所以你建议哪种类型的错误。问题是我在应用程序工作 12 小时后收到此错误。
  • 这段代码多久运行一次?
  • 取决于读取 html 的速度。不到 20 秒
  • 您可以运行这个程序直到它得到异常,然后连接到 Visual Studio 调试器以查看异常发生的位置。您还可以监视内存是否已满。也许你有一些内存泄漏?

标签: c# out-of-memory


【解决方案1】:

我建议查看内存分析器以确保您的应用程序没有任何泄漏。鉴于您说它发生在应用程序工作 12 小时后,这似乎表明它可能是一个缓慢的泄漏,最终导致 OutOfMemory 异常。

有很多方法可以让您无意中保留会导致缓慢泄漏的引用。运行分析器将帮助您识别这些问题。它可能不是导致问题的一行代码。可能只是一行代码经常向您展示压倒骆驼的稻草。

我之前使用过Redgates Ants Profiler(它提供 14 天免费试用),它帮助我大量降低内存使用率并提高性能。我最近似乎经常使用它,但这纯粹是因为我发现它是一个非常有价值的工具。

查看他们的一些walkthroughs 和/或vidoes 以了解如何追踪泄漏。

【讨论】:

  • +1 用于 Ants 分析器。另外,请特别注意大型对象堆统计信息。这是我一直在研究的过程中导致 OOM 的主要原因。
  • 我因为没有取消订阅特定的表单事件而被刺痛。当表单关闭时,它从未被清理过,因此表单(以及它们引用的所有内容)都悬而未决,无法收集。一个小小的改变,就产生了重大的影响。
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 2013-01-14
  • 2013-08-28
  • 2015-07-18
  • 2011-02-14
相关资源
最近更新 更多