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

我正在处理大型XML文件(几兆字节),我必须对其进行各种检查。 但是我的内存和时间使用问题很快就会增长。 我已经像这样测试了它:</ p>

  $ xml = new SimpleXMLElement($ string); 
$ sum_of_elements =(double)0.0;

foreach($ xml- &gt; xpath('// Amt')as $ amt){
$ sum_of_elements + =(double)$ amt;
}
</ code> </ pre>

使用microtime( )和memory_get_usage()-functions运行此代码我得到以下结果:</ p>


  • 5Mb文件(7480 Amt-elements):

      \ n
    • 执行时间0,69s </ li>
    • 内存使用量从10.25Mb增加到29.75Mb </ li>
      </ ul> </ li>
      </ ul>
      \ n

      那仍然很好。 但随后文件内存和文件内存的使用量会大大增加:</ p>


      • 6Mb文件(8976 Amt-elements):


          < li>执行时间8,53s </ li>
        • 内存使用量从10.25Mb增加到99.25Mb </ li>
          </ ul> </ li>
          </ ul>

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

          知道问题出在哪里?</ p>
          </ div>

展开原文

原文

I'm dealing with large XML files (several megabytes) for which I have to make various kind of checks. However I have problem with memory and time usage which grows very quickly. I've tested it like this:

$xml = new SimpleXMLElement($string);
$sum_of_elements = (double)0.0;

foreach ( $xml->xpath('//Amt') as $amt ) {
  $sum_of_elements += (double)$amt;
}

With microtime() and memory_get_usage() -functions I get the following results by running this code:

  • 5Mb file (7480 Amt-elements):
    • execution time 0,69s
    • Memory usage grows from 10.25Mb to 29.75Mb

That's still quite ok. But then with a bit bigger file memory and time usage grow very much:

  • 6Mb file (8976 Amt-elements):
    • execution time 8,53s
    • Memory usage grows from 10.25Mb to 99.25Mb

The problem seems to be in looping the result set. I've also tried for-loop instead of foreach but with no difference. Without looping the memory usage does not grow so much.

Any idea where the problem could be?

1个回答



SimpleXML是基于树的,将整个文档加载到内存中。 使用 unset </ code>为 PHP的GC标记不再需要的资源 在循环中进行清理可能 减少内存使用量。 如果这不能解决问题,请考虑使用 XMLReader 基于方法。 虽然您将无法使用XPath,但内存消耗应该会显着降低。</ p>
</ div>

展开原文

原文

SimpleXML is tree-based and will load the entire document into memory. Using unset to mark no longer needed resources for PHP's GC for cleanup during a loop might yield less memory usage. If that doesnt solve the issue, consider using XMLReader for a pull-based approach. Though you won't be able to use XPath, memory consumption should be significantly lower.

donlih2986
donlih2986 好吧,你可以使用XDebug或Zend Server的内存跟踪工具来查看它在哪里吃你的记忆。 您也可以尝试使用DOM而不是SimpleXml来排除它在SimpleXml中的内存泄漏。 你确定在循环中没有抛出任何错误吗? 你有启用error_reporting吗?
大约 10 年之前 回复
dongtangjie0495
dongtangjie0495 就像我说的那样,循环似乎是问题所在。 如果我只保存结果而不通过它们($ result = $ xml-> xpath('// Amt'))两个文件似乎占用大致相同的内存量。
大约 10 年之前 回复
duannuci4008
duannuci4008 我尝试在循环中取消设置$ amt,但它没有帮助。 真正奇怪的是5mb和6mb文件之间的大跳跃,5mb文件比1Mb文件只需要大约10Mb的内存,但正如你所看到的,6Mb文件比5Mb文件已经超过60Mb。
大约 10 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐