【问题标题】:XML xpath search and array looping with php, memory issueXML xpath搜索和数组循环与php,内存问题
【发布时间】:2010-09-01 11:02:11
【问题描述】:

我正在处理大型 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 元素):
    • 执行时间 0,69s
    • 内存使用量从 10.25Mb 增长到 29.75Mb

这还不错。但是随着文件内存和时间使用量的增加,会大大增加:

  • 6Mb 文件(8976 个 Amt 元素):
    • 执行时间 8.53s
    • 内存使用量从 10.25Mb 增长到 99.25Mb

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

知道问题出在哪里吗?

【问题讨论】:

    标签: php xml arrays


    【解决方案1】:

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

    【讨论】:

    • 我尝试在循环中取消设置 $amt,但没有帮助。真正奇怪的是 5mb 和 6mb 文件之间的巨大跳跃,5mb 文件只比 1Mb 文件多占用大约 10Mb 的内存,但正如你所见,6Mb 文件已经比 5Mb 文件多占用 60Mb。
    • 就像我说的,循环似乎是问题所在。如果我只保存结果而不通过它们 ($result = $xml->xpath('//Amt')) 两个文件似乎占用大致相同的内存量。
    • @JPH 好吧,您可以使用 XDebug 或 Zend Server 的内存跟踪工具来查看它在哪里占用了您的内存。您也可以尝试使用 DOM 而不是 SimpleXml 来排除它是 SimpleXml 中的内存泄漏。你真的确定在循环过程中没有抛出任何错误吗?您是否启用了 error_reporting?
    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2011-07-01
    • 1970-01-01
    • 2021-04-12
    • 2019-11-02
    • 2011-10-31
    相关资源
    最近更新 更多