XML xpath搜索和数组循环与PHP,内存问题

时间:2010-09-01 11:02:12

标签: php xml arrays

我正在处理大型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()函数我通过运行此代码获得以下结果:

  • 5Mb文件(7480 Amt-elements):
    • 执行时间0,69s
    • 内存使用量从10.25Mb增加到29.75Mb

那仍然很好。但随后文件内存越来越大,使用时间也越来越长:

  • 6Mb文件(8976 Amt-elements):
    • 执行时间8,53s
    • 内存使用量从10.25Mb增加到99.25Mb

问题似乎在于循环结果集。我也试过for-loop而不是foreach,但没有区别。没有循环,内存使用量就不会增长太多。

知道问题出在哪里?

1 个答案:

答案 0 :(得分:1)

SimpleXML是基于树的,会将整个文档加载到内存中。在PHP's GC循环期间使用unset标记might yield less memory usage不再需要的资源进行清理。如果这不能解决问题,请考虑使用XMLReader进行基于拉取的方法。虽然您将无法使用XPath,但内存消耗应该会显着降低。