如何读取多个大块文本而不会遇到大对象或垃圾收集第2代问题

时间:2012-10-10 12:17:45

标签: c# garbage-collection

我目前正在创建一个将遍历大量网址的应用,它会下拉源代码,然后使用元素ID等参考点提取特定数据。

将源代码加载到String对象中,然后通过查找IndexOf参考点并执行SubString进行处理。

问题是String对象是垃圾收集中的第2代,这意味着它在收集之前会在内存中停留一段时间。在访问越来越多的URL后,应用程序的内存使用量持续增长。

我运行了应用程序并处理了25个URL,内存使用量跃升至300Mb并且过了一段时间 - 我认为在垃圾收集解雇后 - 内存使用率下降到1Mb。

因为我只需要很短的时间来提取数据,是否有更优化的方法来实现这一目标?

注意我无法以块的形式读取源代码,因为分离可能会在参考点的某个部分发生。

...<a href="http://www.some-website.com/" id="link-I-need">Hyperlink</a>...

可以这样分开

...<a href="http://www.some-website.com/" id="link-] (End of first chunk) - (Start of second chunk) [I-need">Hyperlink</a>...

3 个答案:

答案 0 :(得分:0)

如果您编写代码的方式使得字符串的范围不超过它必须的范围,CLR将在它认为正确的时间收集它。因此,当您的程序需要内存时,CLR将使该内存可用。

除非您正在进行时间敏感的操作,否则CLR的工作方式和清理时间与用户代码无关。

答案 1 :(得分:0)

您是否考虑过其他方法,例如HTML解析器? HTML解析器可能比您尝试的更有效。以下文章可能会有所帮助:What is the best way to parse HTML in C#?

答案 2 :(得分:-1)

如果您还没有,请使用StringBuilder对象并附加到构建器而不是连接字符串。

在每次处理迭代结束时,您可以清除StringBuilder并释放内存。