我使用下面的代码解析一个大小接近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
答案 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。