Intereting Posts

XML xpath поиск и цикл массива с php, проблема с памятью

Я имею дело с большими 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 () я получаю следующие результаты, запустив этот код:

  • Файл 5 Мб (7480 элементов):
    • время выполнения 0,69 с
    • Использование памяти увеличивается с 10,25 Мб до 29,75 МБ

Это все нормально. Но затем с немного большей файловой памятью и использованием времени очень много:

  • Файл 6Mb (8976 элементов):
    • время выполнения 8,53s
    • Использование памяти увеличивается с 10.25Mb до 99.25Mb

Кажется, что проблема связана с циклом набора результатов. Я также пробовал for-loop вместо foreach, но без разницы. Без цикла использование памяти не так сильно растет.

Любая идея, где проблема может быть?

SimpleXML основан на деревьях и загружает весь документ в память. Использование unset для обозначения ненужных ресурсов для GC GC для очистки во время цикла может привести к меньшему использованию памяти . Если это не решит проблему, рассмотрите возможность использования XMLReader для подхода, основанного на pull-based. Хотя вы не сможете использовать XPath, потребление памяти должно быть значительно ниже.