-1

大量のデータを処理するユーティリティをプログラムしようとしていますが、メモリが要因です。残念ながら、私が実行するこのループのセットを実行するたびに、apxを消費します。unset()呼び出しを使用しても、何千回も実行されるため、14MBのメモリが使用されます(もちろん、メモリが完全にクリーンアップされないことは承知しています。質問をしている理由の1つです)。これを行うもっと簡単な方法があるかどうか疑問に思います。現在動作しているコード:

        $qr = array();
        foreach($XML->row as $row)
        {
         $ra = array();
         foreach($row as $key => $value)
         {
         $ra[$key] = $value[0];
         unset($key,$value);
         }
        $qr[] = $ra;
        unset($row,$ra);
        }
        unset($XML);
        return $qr;

別の試みはこれを行うことでしたが、遅れています。誰かが私が間違っていることを知っていますか?

        $qr = array();
        while(list(,$row) = each($XML->row))
        {
         $ra = array();
         while(list($key,$value) = each($row))
         {
         $ra[$key] = $value[0];
         unset($key,$value);
         }
        $qr[] = $ra;
        unset($row,$ra);
        }
        unset($XML);
        return $qr;

基本的に最初のループでは、基本的な配列/オブジェクトの反復を実行しようとしています。2番目のループでは、オブジェクトと配列のインデックスの関連付けを維持しながら、各配列値を調べて1番目の要素を取得しようとしています。動作したのはそれだけだったので(SimpleXMLオブジェクトをループしているため)、もともとはこのように書いたようです。このことをスピードアップしたり、記憶を食べないようにする方法を考え出すためのヒントをいただければ幸いです。

ガベージコレクションまたはより効率的なコードのソリューションを探しています。SimpleXMLは必要ないので、置き換える予定はありません。 より明確に、私は探しています:

  • 内部ループを呼び出す必要なしにSimpleXMLオブジェクトを反復する方法(これは私が$ value [0]を実行したためだけです。なぜそれが必要なのですか?
  • データを反復処理するためのより効率的な方法(速度またはメモリのいずれか)
4

3 に答える 3

1

使用するメモリを減らしたい場合は、SAXパーサーを検討することをお勧めします。これがです。SAXを使用してパーサーを開発することはより困難ですが、SimpleXMLよりも効率的であり、SAXを使用して大きなxmlファイルを解析できます。

于 2012-07-23T19:26:33.017 に答える
1

SimpleXMLは解析時にドキュメント全体をメモリにロードするため、メモリの負荷が高くなります。したがって、呼び出しは参照カウントunset()をデクリメントするだけであり、データはまだメモリに保持されているため、解放されません。これは、SimpleXMLを使用した結果です。その利点は、ドキュメントがメモリ内にあり、PHPオブジェクトとして表されることです。

メモリ使用量を減らしたい場合は、XMLReaderXMLパーサーなどの他のものを使用する必要があります。これらはSAXベース、またはイベントベースであり、XMLファイルをメモリにロードしませんが、一度に1要素ずつツリーをウォークします。XPathのようなものを使用していないように見えるので、これがより良い選択です。

于 2012-07-23T19:27:30.310 に答える
1

これは、SimpleXMLオブジェクトからデータにアクセスする方法ではありません。インデックス[0]を使用して、オブジェクトの各部分の文字列の内容を取得し、それを配列として扱っているようです。 それは配列ではなく、オブジェクトです。 これが文字列データにアクセスする方法です...例:http://php.net/manual/en/simplexml.examples-basic.php#example-5095

このような何かがトリックを行います:

    $qr = array();
    foreach($XML->row as $row)
    {
     $ra = array();
     $ra['name'] = $value->name;
     $ra['name2'] = $value->name2;
     //Add a line for each element name, etc...

    $qr[] = $ra;
    unset($row,$ra);
    }
    unset($XML);
    return $qr;

また、内部ループを取り除き、メモリを節約します。

于 2012-07-25T13:05:29.610 に答える