|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
while (true)
{
string ip = obj.ToString().Split('|')[1];
string robsn = obj.ToString().Split('|')[0];
ChromeOptions options1 = new ChromeOptions();
// InternetExplorerOptions internetExplorerOptions = new InternetExplorerOptions();
// 不显示浏览器
options1.AddArgument("--headless");
options1.AddArgument("--disable-gpu");
options1.AddArgument("--disable-cache");
options1.AddArgument("--incognito");
options1.AddArgument("--first run");
// internetExplorerOptions.
IWebDriver driver = new ChromeDriver(options1); //new EdgeDriver(options1);
try
{
string url = "http://" + ip;
string url2 = "http://" + ip + "/doc/XPOF.html";
bool online = false;
Ping ping = new Ping();
PingReply pingReply = ping.Send(ip);
if (pingReply.Status == IPStatus.Success)
{
online = true;
Console.WriteLine(ip + " | 当前在线,已ping通!");
}
else
{
online = false;
Console.WriteLine(ip + " | 在线,ping不通!");
}
if (online)
{
driver.Navigate().GoToUrl(url);
var element = driver.FindElement(By.Name("password"));
var _element = driver.FindElement(By.Name("goto"));
element.SendKeys("admin");
_element.Click();
driver.Navigate().GoToUrl(url2);
driver.SwitchTo().Frame("XFrameTablePage");
var element_ = driver.FindElement(By.Name("XForm"));
var tbody_element = element_.FindElements(By.TagName("table"))[0].FindElements(By.TagName("tbody"))[0].FindElements(By.TagName("tr"))[0].FindElements(By.TagName("td"))[1].FindElements(By.TagName("table"))[0].FindElements(By.TagName("tbody"))[0];
string POF1 = tbody_element.FindElements(By.TagName("tr"))[1].FindElements(By.TagName("td"))[1].Text;
string POF2 = tbody_element.FindElements(By.TagName("tr"))[2].FindElements(By.TagName("td"))[1].Text;
string POF3 = tbody_element.FindElements(By.TagName("tr"))[3].FindElements(By.TagName("td"))[1].Text;
string sql;
string sql2 = "select * from rapidio where robsn='" + ip + "' and name in ('port2','port3','port4') order by updatetime desc";
DataTable dt = SqlHelper.ExecuteQuery(sql2);
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
string port = dt.Rows[i]["name"].ToString();
string pof = string.Empty;
switch (port)
{
case "port2":
pof = POF1;
break;
case "port3":
pof = POF2;
break;
case "port4":
pof = POF3;
break;
}
if (Convert.ToDateTime(dt.Rows[i]["updatetime"]).ToString("yyyy-MM-dd") != DateTime.Now.ToString("yyyy-MM-dd"))
{
sql = "insert into rapidio(robsn,type,name,value,updatetime) values('" + ip + "','交换机数据','" + port + "','" + pof + "','" + DateTime.Now.ToString("yyyy-MM-dd") + "')";
SqlHelper.ExecuteNonQuery(sql);
}
else
{
sql = "update rapidio set value='" + pof + "' where name = '" + port + "' and updatetime ='" + DateTime.Now.ToString("yyyy-MM-dd") + "' and robsn='" + ip + "'";
SqlHelper.ExecuteNonQuery(sql);
}
}
}
else
{
sql = "insert into rapidio(robsn,type,name,value,updatetime) values('" + ip + "','交换机数据','port2','" + POF1 + "','" + DateTime.Now.ToString("yyyy-MM-dd") + "'),('" + ip + "','交换机数据','port3','" + POF2 + "','" + DateTime.Now.ToString("yyyy-MM-dd") + "'),('" + ip + "','交换机数据','port4','" + POF3 + "','" + DateTime.Now.ToString("yyyy-MM-dd") + "')";
SqlHelper.ExecuteNonQuery(sql);
}
string sqlcmd = "insert into exchangedata (robsn,exchangeip,name,value,updatetime) values('" + robsn + "','" + ip + "','port2','" + POF1 + "','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'),('" + robsn + "','" + ip + "','port3','" + POF2 + "','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "'),('" + robsn + "','" + ip + "','port4','" + POF3 + "','" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "')";
SqlHelper.ExecuteNonQuery(sqlcmd);
}
}
catch (Exception e)
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "|" + e.ToString());
}
options1 = null;
CloseChromeDriver(driver);
Thread.Sleep(sleeptime);
}
这段代码看起来在执行过程中可能会产生内存泄露的问题。在多线程环境中执行Web爬虫任务时,如果没有妥善处理对象的创建和销毁,可能会导致内存持续增加。这种现象通常是由于某些资源没有被及时释放,比如未关闭的数据库连接、未关闭的网络连接、未关闭的文件流,或者一些大对象未能及时被垃圾回收等。
具体来看,我注意到你的代码中存在一些可能的内存泄露的风险点:
1. Selenium WebDriver的使用:每个线程都会创建一个新的WebDriver实例,这可能会导致大量的内存使用。你的代码中使用了 CloseChromeDriver(driver); 这个函数,但我无法看到这个函数的定义,不确定是否正确关闭了WebDriver。如果只是简单的调用 driver.Quit() ,还不足以清理所有资源,可能需要进一步手动清理。
2. 数据库连接:从你的代码中可以看出,有大量的对数据库的操作。你使用了SqlHelper类来执行查询和非查询操作,但是没有看到与数据库连接相关的代码。如果每个操作都创建一个新的数据库连接,并且在操作完成后未能正确关闭,那么可能会导致数据库连接资源的泄露,从而导致内存持续增加。
3. 多线程操作:在你的代码中,你的爬虫任务在一个无限循环中执行,这意味着线程可能永远不会结束。你需要确保这些线程在完成任务后能够正确结束,否则这些线程及其关联的资源可能永远不会被清理。
4. Ping类和PingReply对象:你的代码创建了Ping和PingReply对象,但没有显式地释放这些对象。在.Net中,虽然有垃圾回收机制,但是对于实现了IDisposable接口的对象,你仍需要手动调用Dispose方法来释放资源。
综上所述,你需要检查一下上述可能导致内存泄露的地方,并且需要注意及时释放不再使用的资源。如果问题依然存在,你可能需要使用一些诊断工具,比如Visual Studio的性能分析工具,来查看内存使用的详细信息,以帮助你定位问题。
|
|