解析50GB xml文件,导致内存不足致命错误

时间:2014-08-08 09:52:55

标签: php xml

我使用下面的代码解析一个大小接近50GB的xml文件。越来越 致命错误:内存不足(已分配524288)(尝试分配5000000001字节)

    $xml_parser = xml_parser_create();
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler($xml_parser, "startElement", "endElement");
    xml_set_character_data_handler($xml_parser, "characterData");
    if (!($fp = fopen($file, "r"))) {
        die("could not open XML input");
    }

    $e=4096;
    $file_content = fread($fp, 5000000000);

    xml_parse($xml_parser, $file_content, feof($fp));
    echo "<pre>";
    print_r($valuess);
    if(is_array($valuess)){
      mysql_connect('********', '*****', '*******');
      mysql_select_db("wp534");

    for($i=0;$i<count($valuess);$i++)
    {
    $sql = "INSERT INTO wp_xmldata (RegistreringNummerNummer, KoeretoejMaerkeTypeNavn, KoeretoejModelTypeNavn, KoeretoejVariantTypeNavn, KoeretoejTypeTypeNavn, KoeretoejOplysningFoersteRegistreringDato, DrivkraftTypeNavn, SynResultatSynsDato) values ";
    $items=array();
    $valuesArr=array();    
    //echo ($i+1).'  ------------------------<br/>';

      for($j=0;$j<count($names[$i]);$j++)
      {  //echo $names[$i][$j].'=>'.$valuess[$i][$j]."</br>";
                $a=explode("ns:",$names[$i][$j]); 
                $items[$a[1]]=$valuess[$i][$j];

      }
                $valuesArr[] = "('$items[RegistreringNummerNummer]','$items[KoeretoejMaerkeTypeNavn]','$items[KoeretoejModelTypeNavn]','$items[KoeretoejVariantTypeNavn]','$items[KoeretoejTypeTypeNavn]','$items[KoeretoejOplysningFoersteRegistreringDato]','$items[DrivkraftTypeNavn]','$items[SynResultatSynsDato]')";

    $sql .= implode(',', $valuesArr);
    /******start code for append data**********/
    /*$select="select * from wp_xmldata where RegistreringNummerNummer = '$items[RegistreringNummerNummer]'";
    //echo $fetch11;
    $select_result=mysql_query($select);
    if(mysql_num_rows($select_result) == 0)
    { //echo $sql;
      mysql_query($sql);
    }*/
    /******end code for append data**********/
    //mysql_query($sql);
    //echo $sql; 

    }

        enter code here

    }

    xml_parser_free($xml_parser);
    fclose($fp);

有人对此提出建议吗?

谢谢, Ankit Sanghvi

1 个答案:

答案 0 :(得分:3)

你的问题还没有在这里使用XML解析器,更基本的是:

 $file_content = fread($fp, 5000000000);

PHP字符串中的AFAIK大小限制为2GB。您尝试在该字符串中获得50GB。这根本行不通。请查阅哪些数据适合哪种数据类型的文档。对于字符串,您可以在此处获取信息:

  

注意: string最大可达2GB(最大2147483647字节)

来源: http://php.net/manual/en/language.types.string.php

因此,您应该理解xml_parse必须一次对整个字符串进行操作,它允许按块解析块。在这里,您应该阅读手册,了解这些功能的用途,然后编写代码。

特别是当你已经撞墙时。是时候改变代码并用拉动逻辑重写代码了。或者,取XMLReader,或许XMLReaderIterator extension