我目前正在创建一个将遍历大量网址的应用,它会下拉源代码,然后使用元素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>...
答案 0 :(得分:0)
如果您编写代码的方式使得字符串的范围不超过它必须的范围,CLR将在它认为正确的时间收集它。因此,当您的程序需要内存时,CLR将使该内存可用。
除非您正在进行时间敏感的操作,否则CLR的工作方式和清理时间与用户代码无关。
答案 1 :(得分:0)
您是否考虑过其他方法,例如HTML解析器? HTML解析器可能比您尝试的更有效。以下文章可能会有所帮助:What is the best way to parse HTML in C#?
答案 2 :(得分:-1)
如果您还没有,请使用StringBuilder对象并附加到构建器而不是连接字符串。
在每次处理迭代结束时,您可以清除StringBuilder并释放内存。