我有100+ MB的XML文件,每个文件包含不同数量的节点,信息存储在属性中。 喜欢
<Node NodeID="100" Value="100500" Option1="Getting heavy"....>
<Node NodeID="101".....>
我需要在随机时间访问任何一个此元素(因此我无法分离文件并一点一点地对其进行流式传输。)
我试图将XML的内容转换为PHP数组。我有像这样的数组
$FileName['Attribute']['NodeID'];
但是,当我尝试存储3MB以上的文件时,PHP CLI进程开始使用大量(数十万MB)的RAM。 考虑到我需要直接访问每个单独的元素和属性,我如何有效地存储那么多(100MB)的数据? 我以前使用的代码是关于大量带有simplexml对象的foreach()(因此,我没有存储$ FileName ['Atrribute'] ['NodeID'],而是打开文件并进行了遍历,直到找到具有所需NodeID的元素,然后提取其属性。但是我需要的互动次数越多,所有“ foreach()”就需要越多的时间。随着这个爱好项目的发展,互动变得越来越复杂,因此脚本执行时间越来越短这就是为什么我决定将全部数据存储在RAM中(考虑到我无法以其他格式获取源代码)。 如何将所有内容存储在RAM中,而脚本却不消耗大量RAM? 使用的代码示例:
function SaXtA ($filenames, $ArrayName, $KeyAttrib)
{ $list=explode(" ", $filenames);
$Anames=array();
global ${$ArrayName};
${$ArrayName}=array();
foreach($list as $filename){
if($filename!=""){
$objector=simplexml_load_file($filename);
foreach($objector->xpath('/idspace/Class') as $products)
{
$classId=0;
foreach ($products->attributes() as $a => $b)
{
/**
* Don't really matter in which form i`ll have access to attributes.
*
*/
${$ArrayName}[(string)$a][(int)$products['ClassID']] = $b;
}
}
}}
}
$megaitems='';
foreach (glob("./XML/datatable_item_*.xml") as $filename) {
$megaitems.=$filename.' ';
}
答案 0 :(得分:0)
simplexml_load_file
将整个XML结构加载到内存中。随着文件变大,内存使用量也会增加。
相反,您将要使用PHP的xml_parse
,它将使您在逐步浏览文件时流式传输并对其进行处理。