我正在处理大型XML文件(几兆字节),我必须对其进行各种检查。但是我的内存和时间使用问题很快就会增长。我测试过这样:
$xml = new SimpleXMLElement($string);
$sum_of_elements = (double)0.0;
foreach ( $xml->xpath('//Amt') as $amt ) {
$sum_of_elements += (double)$amt;
}
使用microtime()和memory_get_usage()函数我通过运行此代码获得以下结果:
那仍然很好。但随后文件内存越来越大,使用时间也越来越长:
问题似乎在于循环结果集。我也试过for-loop而不是foreach,但没有区别。没有循环,内存使用量就不会增长太多。
知道问题出在哪里?
答案 0 :(得分:1)
SimpleXML是基于树的,会将整个文档加载到内存中。在PHP's GC循环期间使用unset
标记might yield less memory usage不再需要的资源进行清理。如果这不能解决问题,请考虑使用XMLReader进行基于拉取的方法。虽然您将无法使用XPath,但内存消耗应该会显着降低。