手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:内存

转:phpQuery占用过多内存的解决方法

事实上,看到这篇文章的时候,我早就已经解决这个问题了。目前我也是这么做的,只是我是设置phpQuery::$documents = null而已,和他不太一样。
但本文做了一点分析,所以我还是正常的贴一下吧。

phpQuery是一个用php实现的类似jQuery的开源项目,可以在服务器端以jQuery的语法形式解析网页元素。 相对于正则或其它方式匹配网页方式,phpQuery使用起来要方便的多。

在使用phpQuery采集网页时,遇到一个问题:在处理大量网页之后,phpQuery占用的内存数量非常惊人(很快就超过了1G),

比如这段代码:

while (true) {
    phpQuery::newDocumentFile($htmlFile);
    // 处理网页元素...
    echo memory_get_usage() . "\n";
}

谨慎运行上面这段代码,它会很快用光你的内存。

经过查看phpQuery的源代码终于发现了问题所在,phpQuery在每处理一个网页就会产生一个DOMDocumentWrapper 对象,而每个DOMDocumentWrapper 对象会被保存在静态成员$documents中(phpQuery::createDocumentWrapper中),这个变量是一个数组,每解析一个 网页数组元素就增加一个。

phpQuery::$documents[$wrapper->id] = $wrapper;

找到问题后,解决就很容易了,每次解析完一个网页,把phpQuery::$documents置空即可。

while (true) {
    phpQuery::newDocumentFile($htmlFile);
    // 处理网页元素...
    phpQuery::$documents = array();
    echo memory_get_usage() . "\n";
}

内存占用稳定了。

----
原文来自:http://www.linuxsong.org/2011/01/phpquery-memory-leak/
其实出现上面的问题很正常,大多数人在用pq的时候都是在不停的抓取和采集,一般在命令行下面,这时候都不会想到释放内存,而平时网页的话,一个页面结束后,这些内存都还是会自动释放掉一点。如果不是狠狠抓数据的人,是不会遇到这种问题的啦。

Tags: phpquery, 内存

谷歌研究报告显示内存引起的故障率极高

这是一份来自google的报告,他们的取样率应该是远超那些实验室的。所以,以后要注意了。为服务器选一个好内存是非常重要的事情。。不然,想后悔也来不及啊【虽然换内存很方便,但宕机一天两天总不是好事情,特别对于小站长来说】

还在为你的计算机为什么老是死机而困扰吗?据谷歌最近的一项研究表明,大多数死机故障均是由内存问题而引起的,谷歌最近对自己数据中心中大量计算机两年半内的工作状况进行了搜集整理,抽样的范围可谓史上最大,结果显示内存问题而导致的故障率比早先一些研究中所显示的要高得多。

研究报告指出:“我们发现内存的整体故障率和不同插槽上内存条的故障率比过去的研究结果要高出许多。研究结果显示内存部分出现故障绝不是少数情况。”

那么实际的内存故障率有多高呢?根据谷歌统计,每年有1/3的谷歌服务器都会出现可纠正的内存故障,而有1/100的谷歌服务器会出现不可纠正的内存故障,后者是造成系统死机的典型情况之一。

如果以上的数字看起来还不是显得那么惊人,那么下面的数字应该更具备说服力。每年每条内存条的平均可纠正故障为4000次。请注意,谷歌服务器内存配有 ECC校验机构,因此这里所谓的可纠正故障可以通过ECC校验机构得以修复,而我们家用PC机中所用的内存条一般都不具备ECC校验功能,因此这里的 4000次在家用机上其实就等于无法纠正的故障。

此前类似的研究规模并不如这次谷歌取样的规模,多是在一些由300多台计算机组成的簇中进行,这些研究显示内存出现可纠正故障的几率是每十亿小时 200-5000次,相比之下,谷歌这次抽样的结果显示的故障率则要高出许多,每十亿小时达到了25000-75000次的水平。

尽管内存故障会导致严重的问题,但对家用机而言,内存故障导致的严重后果要比服务器上的低得多。服务器通常将大量数据存放在内存中,并经常要将这些数据写入硬盘;而家用机的内存中则一般只存储应用程序或操作系统运行所需的文件。

另外,这次研究的结果在其它几点上也与过去的经验论呈现出较大的区别

1、温度并不是大问题:

通常我们会认为温度过高时导致内存故障率较高的主要因素之一。但据这次谷歌研究的结果表明,内存工作温度上的差异对故障率高低的影响其实很小。不过研究结果同时表明系统占用率较高的系统,内存的故障率也比较高,而系统占用率高的系统中内存的温度则一般是较高的。

2、内存硬件故障率比软件故障率更高:

这次研究结果显示内存出现硬件故障的几率比出现软件故障的几率要高。而以前的研究则得出过于此完全相反的结论;

3、使用新技术的内存芯片的故障率并不比旧内存产品高:

过去人们一度认为采用新技术的内存如DDR2内存等由于晶体管密度更大,因此出现故障的几率要比旧内存更高。而这次谷歌的研究结果则表明采用新技术的内存故障率明显比旧款内存故障率要低。

据这次研究结果显示,内存条出现第一次故障之后,很快便会再次出现故障,而且故障率还会随着时间的推移而逐步增加。

CNBeta编译
原文:
cnet
本文来自:http://www.cnbeta.com/articles/95088.htm

Tags: 内存