0

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

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

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

我运行了该应用程序并处理了 25 个 URL,内存使用量跃升至 300Mb,一段时间后 - 我假设在垃圾收集启动后 - 内存使用量回落到 1Mb。

所以既然我只需要很短的时间来提取数据,有没有更优化的方法呢?

请注意,我无法分块读取源代码,因为分离可能会在参考点的中途发生。

IE

...<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>...
4

3 回答 3

0

如果您以这样一种方式编写代码,即没有字符串在范围内超过它必须的长度,CLR 将在它认为合适的时间收集它。因此,当您的程序需要内存时,CLR 将使该内存可用。

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

于 2012-10-10T12:23:28.920 回答
0

您是否考虑过其他方法,例如 HTML 解析器?HTML 解析器可能比您尝试的更有效。以下文章可能会有所帮助:在 C# 中解析 HTML 的最佳方法是什么?

于 2012-10-10T13:33:34.947 回答
-1

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

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

于 2012-10-10T12:21:46.640 回答