软件很占内存直到电脑死机---求解决方案

JackLeiMM 2010-08-05 10:46:49
自己写了一个爬URL的代码,但是很占内存,调用了内存回收的方法,但是没有用,请好的解决方案
上代码

try
{
string html = webBrowser1.Document.Body.InnerHtml;
MatchCollection matches = Regex.Matches(html, @"http://[-.a-z0-9_]{4,20}\.blog\.163\.com/|http://blog\.163\.com/[-.a-z0-9@_]{4,25}/");
foreach (Match match in matches)
{
string blog = match.ToString();
this.dbinsert(blog);
}
//SHDocVw.WebBrowser wb = this.webBrowser1.ActiveXInstance as SHDocVw.WebBrowser;
//wb.NavigateComplete2 += new SHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(wb_NavigateComplete2);
if (html.Contains("<A class=Next onclick=\"MembersListForm.dataPageManager.clickNext(); return false;\""))
{
////MessageBox.Show("包含");
//this.webBrowser1.Document.InvokeScript("nb.p['m-62'].g.pu", new string[] { "1" });
for (int i = 0; i < webBrowser1.Document.All.Count; i++)
{
string tagname = webBrowser1.Document.All[i].TagName.ToString().ToLower();
if (tagname == "a")
{
string str = webBrowser1.Document.All[i].OuterHtml;
if (str.Contains("<A class=Next onclick=\"MembersListForm.dataPageManager.clickNext(); return false;\""))
{
webBrowser1.Document.All[i].InvokeMember("click");//引发”CLICK”事件
GC.Collect();
GC.WaitForPendingFinalizers();
//webBrowser1.Document.All[i - 1].InvokeMember("click");//引发”CLICK”事件
break;
}
}
}
this.timer1.Start();
}
else
{
webBrowser1.Navigate(dbblog());
}
}
catch (Exception)
{
this.Form1_Load(sender, e);
}

问题可能就是出现在循环哪里。进入一个帖子后,有几百页的回复。。。。。每一页都有700个左右的东西需要循环判断。。。。
希望大家踊跃回复,非常着急
...全文
188 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
昨今明2017 2010-08-05
  • 打赏
  • 举报
回复
我也抽取过AJAx的数据,但我说我几点你应该优化一下的。
dopsop110 2010-08-05
  • 打赏
  • 举报
回复
你要抓取的网页太多了
JiuchunYoung 2010-08-05
  • 打赏
  • 举报
回复
在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。

你知道CPU指令流水线和指令、数据的Cache命中的概念吗?如果你的“跳读”会跨越cache交换块,甚至page边界的话,就会造成CPU数据cache重新批量装载数据,甚至从虚拟内存中恢复磁盘数据,这当然严重影响效率。

这个“跨循环层”的概念本身是说,由外层循环进入内层循环是要重新初始化循环计数器的,包括保存外层循环的计数器和加载内层循环计数器,退出内层的时候再恢复外层循环计数器。把长循环放在里面可以显著减小这些操作的数量。
但是另一方面还要注意数据结构本身的效率
JackLeiMM 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sisoxy 的回复:]
1、html.Contains
一个网页比较大,这样处理效率不高
2、 for (int i = 0; i < webBrowser1.Document.All.Count; i++)
{
string tagname = webBrowser1.Document.All[i].TagName.ToString().ToLower();
if (tagname == "a")……
[/Quote]
这个功能是点击下一页的
因为是AJAX页面。。。。所以。。。。。
dodducs 2010-08-05
  • 打赏
  • 举报
回复
一直处于递归调用当中,,可能因为主方法没有完成 所以无法回收全部内容吧
昨今明2017 2010-08-05
  • 打赏
  • 举报
回复
1、html.Contains
一个网页比较大,这样处理效率不高
2、 for (int i = 0; i < webBrowser1.Document.All.Count; i++)
{
string tagname = webBrowser1.Document.All[i].TagName.ToString().ToLower();
if (tagname == "a")
WebBrowser应该有直接取出所有连接的属性
3、你要进入每一页取回复,取每一个回复的内容,最好使用正则。
hyblusea 2010-08-05
  • 打赏
  • 举报
回复
把功能再细分到多个不同的方法中, 有助于垃圾回收.
viki117 2010-08-05
  • 打赏
  • 举报
回复
貌似他们都用正则,不懂啊
porschev 2010-08-05
  • 打赏
  • 举报
回复
看不出什么代码问题来。。

LZ这段代码层次也够深的。。。5层。。还有两个循环。。。

Strawberry0924 2010-08-05
  • 打赏
  • 举报
回复
不太懂爬虫,不过关注中……
josxhn 2010-08-05
  • 打赏
  • 举报
回复
请问什么叫 爬 url
bennyyyyy 2010-08-05
  • 打赏
  • 举报
回复
你的线程开好了没
别把线程弄到死锁了
deknight 2010-08-05
  • 打赏
  • 举报
回复
加内存...
louti 2010-08-05
  • 打赏
  • 举报
回复
学习一下!

guyehanxinlei 2010-08-05
  • 打赏
  • 举报
回复
学习一下!
JackLeiMM 2010-08-05
  • 打赏
  • 举报
回复
继续啊,为什么没人能帮我啊

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧