如何使用PHP存储大量数据?

时间:2019-04-02 02:21:00

标签: php arrays ram

我有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.' ';

    }

1 个答案:

答案 0 :(得分:0)

simplexml_load_file将整个XML结构加载到内存中。随着文件变大,内存使用量也会增加。

相反,您将要使用PHP的xml_parse,它将使您在逐步浏览文件时流式传输并对其进行处理。