@bkistav

Как оптимизировать вложенные циклы foreach в PHP?

Здравствуйте.
Возник вопрос по оптимизации вложенных циклов с целью парсинга в БД, данных из XML.
<?php

// читаем XML с районами
$xmlFile = "http://путь-к-XML/Districts";
$xml = simplexml_load_file($xmlFile);
$districts = $xml->Districts->District;

foreach($districts as $val) {
    $districtId = $val['Id'];
    $districtName = $val['Name'];

    // пишем результаты в БД

    /* 
    Читаем XML с городами в каждом районе.
    Для чтения городов, необходимо передать ардесной строке с XML файлом Id района   
    */
    $xmlFile2 = "http://путь-к-XML/Cities".$districtId;
    $xml2 = simplexml_load_file($xmlFile2);
    $cities = $xml2->Cities->City;

    foreach($cities as $val) {
        $cityId = $val['Id'];
        $cityName = $val['Name'];

        // пишем результаты в БД

        /* 
        Читаем XML с улицами в каждом городе.
        Для чтения улиц, необходимо передать ардесной строке с XML файлом Id города   
        */
        $xmlFile3 = "http://путь-к-XML/Cities".$cityId;
        $xml3 = simplexml_load_file($xmlFile3);
        $streets = $xml3->Streets->Street;

        foreach($streets as $val) {
            $streetId = $val['Id'];
            $streetName = $val['Name'];

            // пишем результаты в БД

            // и т.д. вплоть до дома
        }
    }
}

?>

С каждым циклом увеличивается количество итераций, выполняется такой вариант крайне долго и очевидно, что это неэффективное решение. "Коматозить" его начитает уже на 3-м цикле при попытке не то чо бы записать в базу, даже посчитать кол-во улиц.

Вопрос: как можно оптимизировать данный парсер?

Буду признателен за помощь.
  • Вопрос задан
  • 4682 просмотра
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 2
Если возможно, парсить по кускам. Если "пишем результаты в БД" это простой INSERT, то делать его не каждый раз. а вставлять по несколько записей за раз (VALUES), в зависимости от количества данных (попробовать 1000 вставить для начала).

$xmlFile3 = "http://путь-к-XML/Cities".$districtId;


Эта строка два раза повторяется, можно не читать второй раз.
Ответ написан
Rema1ns
@Rema1ns
и так сойдет
циклы foreach используют виртуальную копию, можно ускорить процесс как минимум использузуя for. А так же воспользоваться комментарием Максима Барулина )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽