C# PhantomJS截图后巨大的内存消耗
我通过Selenium使用PhantomJS,在一个有很多图片的网站上遇到了一个问题 当我尝试截图时,PhantomJS进程内存消耗非常高,≈400-450 MB(≈屏幕截图前100 MB) 使用C# PhantomJS截图后巨大的内存消耗,c#,selenium,selenium-webdriver,phantomjs,C#,Selenium,Selenium Webdriver,Phantomjs,我通过Selenium使用PhantomJS,在一个有很多图片的网站上遇到了一个问题 当我尝试截图时,PhantomJS进程内存消耗非常高,≈400-450 MB(≈屏幕截图前100 MB) 使用--load images=no更好,≈70-100 MB 有没有办法在不完全禁用图像的情况下解决此问题?也许可以只拍摄可视区域的屏幕截图而不是整页 与其他网络驱动程序(如Chrome)配合使用,效果良好 class Program { public static RemoteWebDriver
--load images=no
更好,≈70-100 MB
有没有办法在不完全禁用图像的情况下解决此问题?也许可以只拍摄可视区域的屏幕截图而不是整页
与其他网络驱动程序(如Chrome)配合使用,效果良好
class Program
{
public static RemoteWebDriver CreatePhantomJsDriver()
{
var service = PhantomJSDriverService.CreateDefaultService();
//service.AddArgument("--load-images=no");
var options = new PhantomJSOptions();
options.AddAdditionalCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36");
return new PhantomJSDriver(service, options);
}
public static void SaveScreenshot(RemoteWebDriver driver)
{
try
{
driver.TakeScreenshot().SaveAsFile(DateTime.Now.Ticks + ".jpg", ImageFormat.Jpeg);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static void Main(string[] args)
{
using (var driver = CreatePhantomJsDriver())
{
driver.Manage().Window.Size = new Size(1600, 1200);
driver.Url = "http://color-looks.ru/index";
Thread.Sleep(5000);
SaveScreenshot(driver);
Thread.Sleep(5000);
}
}
}
(这不是我使用的网站,因为它需要登录/密码验证,只是一些来自谷歌的图片密集型网站,内存消耗稍微低一些,但仍然很大-≈300 MB)试试这个:
Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
ss.SaveAsFile(DateTime.Now.Ticks + ".jpg", ImageFormat.Jpeg);
方法TakeScreenshot返回位图对象。您提供的代码示例没有处理这个对象,因此GDI对象在内存中挂起很长一段时间(可能是无限期的) 将代码更改为:
public static void SaveScreenshot(RemoteWebDriver driver)
{
try
{
using(var screenshot = driver.TakeScreenshot())
{
screenshot.SaveAsFile(DateTime.Now.Ticks + ".jpg", ImageFormat.Jpeg);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
你可以设置,但我不知道它是否对你有用,也不知道你是否可以像设置用户代理字符串那样设置。你看到了吗?@Nathan,我不知道这对我有什么帮助。我不想在截图后立即关闭页面,当我关闭页面时(通过处理驱动程序对象),内存会被释放。如果我转到另一个页面/URL,它也会减少到正常值。我的问题是,当我在一个页面上截图时,内存消耗会大大增加,因此我不能同时使用多个(5-8)PhantomJS实例(我使用的机器上没有足够的内存)。@Alex1123我试图对代码进行一些修改,您提供的页面产生66mb的峰值,每次加载页面时都会有一点变化。正如Nathan所建议的,GC并没有收集所有内容,因此在
SaveScreenshot
之后立即强制收集它确实会将内存消耗降低到20mb左右,并且无论屏幕截图数量如何,它都会保持在那里。相比之下,Chrome选项卡使用230mb来呈现页面,因此我认为您在这里表现不错。顺便说一句,你说的“与其他网络驱动程序(如Chrome)一起工作很好”是什么意思?@Heki我认为Chrome网络驱动程序而不是PhantomJS的内存使用率不高。我有2个Chrome进程(主进程和选项卡进程),每个进程45-50MB。您确定它使用230 MB吗?您可能还需要确保在提取屏幕截图后关闭PhantomJS客户端。