Как эффективно анализировать данные XML? - PullRequest
2 голосов
/ 08 июля 2011

У меня есть 2 вопроса:

1-Мне нужно проанализировать XML-файл и вставить данные в базу данных MySQL.Допустим, размер файла составляет около 250 кБ (но он может быть еще больше) и в нем много подузлов, поэтому мне нужно как минимум 3 таблицы.Я проанализировал XML с SimpleXml и успешно вставил все данные в БД.Но для этого точного файла потребовалось около 160 секунд, что мне кажется очень много.Есть ли способ сделать лучше, за меньшее время?

И еще один вопрос - мне нужно получить XML-файл из URL-адреса и сохранить его на сервере, и я не уверен, как это сделать...

Спасибо за ваши ответы.

Код для разбора xml

function parse_xml($file=""){
  global $database;
  if(file_exists($file) && !empty($file)){
      $sport = new SimpleXMLElement($file, null, true);    
      $count = count($sport->OddsObject)-1;
      $listAttr = array();
      $start_time = time();
      for($i=0; $i <= $count; $i++){
          $countMatch = count($sport->OddsObject[$i]->Matches->Match)-1;
          //echo $countMatch; 
          for($k=0; $k <= $countMatch; $k++){           
              $OOdata = $sport->OddsObject[$i]->children();
              $columns = array();
              $data = array();
              foreach($OOdata as $key => $value){            
                  if($key != "Matches"){
                      //$listAttr[$i][$key] = $attr;
                      $columns[] = $key;
                      if ($value != "") {
                          $data[] = "'" . $database->escape_value($value) . "'";
                    } else {
                         $data[] = "NULL";
                    }
                }
            }        

            //get matches: MatchId, Date, HomeTeam, AwayTeam
            $Mdata = $sport->OddsObject[$i]->Matches->Match[$k]->children();     
            foreach ( $Mdata as $key => $value) {
                if($key != "OddsData"){    
                    $columns[] = $key;
                    if ($value != "") {
                      $data[] = "'" . $database->escape_value($value) . "'";
                    } else {
                      $data[] = "NULL";
                    }    
                }
            }                      
            $cols = strtolower(implode(",",$columns));
            $values = implode(",",$data);
            $sql = "INSERT INTO sports($cols) values(".$values.")";
            if($database->query($sql)) {
                $last_id = $database->insert_id();

                $countData = count($sport->OddsObject[$i]->Matches->Match[$k]->OddsData)-1;
                for($t=0; $t <= $countData; $t++){
                    //get OddsData: Home-,Draw-, -Away ...
                    $ODdata = $sport->OddsObject[$i]->Matches->Match[$k]->OddsData[$t]->children();
                    foreach($ODdata as $key=>$attr){
                        $MID = $last_id;
                        $new_bet = Bet::make($attr->getName(),$attr, $MID);
                        $new_bet->save(); 

                    }                    
                }
            }
        }
        $end_time = time() - $start_time;
    }    
    return $end_time;
}
else{
    die("The file doesn't exist.");
}
}

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

Довольно простой способ получить файл из URL-адреса и записать его - file_get_contents () и file_put_contents ().

SimpleXML должен быть довольно эффективным и быстрым для файла, который занимает всего 250 КБ.Ваша медлительность может быть связана с вашими вставками в базу данных.Попробуйте сгруппировать вставки в базу данных.Я обнаружил, что одновременное выполнение 50 вставок работает лучше всего (хотя это зависит от размера строки).Это, вероятно, ускорит весь процесс.

1 голос
/ 08 июля 2011

Я полагаю, вы анализируете это с

$dom = new DOMDocument();   
... 
// read and insert into db

DOM может использовать значительный объем памяти и процессора по сравнению с SAX-парсером, вы можете попробовать закомментировать код базы данных и запустить его, чтобы увидеть, использует ли он слишком много ЦП и ОЗУ, если вы захотите перекодировать его с помощью SAX-парсер, как показано здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...