Я имею дело с большими 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, но без разницы. Без цикла использование памяти не так сильно растет.
Любая идея, где проблема может быть?
SimpleXML основан на деревьях и загружает весь документ в память. Использование unset
для обозначения ненужных ресурсов для GC GC для очистки во время цикла может привести к меньшему использованию памяти . Если это не решит проблему, рассмотрите возможность использования XMLReader для подхода, основанного на pull-based. Хотя вы не сможете использовать XPath, потребление памяти должно быть значительно ниже.