0

ネストされたツリー(ネストされたツリーの動作)を管理するためにDoctrineExtensionsを使用しています。csvファイルから10〜20Kのレコードをインポートし、データベースに保存する必要があります。

このタスク用に、一連の新しいカテゴリ(ツリーノード)を作成し、これらのカテゴリの親を設定して永続化するサービスを作成しました。最後に、EntityManager#flushメソッドを呼び出して、作成したカテゴリをデータベースに保存します。

私の論理によれば、プロセスは次のようになります。

  1. 拡張機能は、各ノード(右、左、レベルなど)に必要なデータを計算します
  2. Doctrineは、次のように、すべてのデータを挿入するクエリを作成します。

    INSERT INTO table (field1, field2, parent_id, root, left, ...) VALUES
    (fields of 1st record),
    (fields of 2st record),
    ...
    

ただし、Doctrineは各レコードを個別に挿入し、さらにルート、左、右の値がフラッシュ中に更新されるため、大量の更新クエリが必要になります。

70のカテゴリを挿入するには、最大250のクエリが必要でしたが、500のカテゴリを追加したい場合、メモリ不足のためにプログラムが終了しました。

プロセスを最適化するにはどうすればよいですか?もちろん、最初から書くこともできますが、このすばらしい拡張機能を使用したいと思います。

4

1 に答える 1

1

私の解決策は、ネストされたツリーの代わりにマテリアライズドパスツリーを使用することでした。私は知っています、それはこの問題の本当の解決策ではありませんが、それは効率的に機能します。より良い解決策があれば、投稿してください。私はそれを解決策として受け入れるかもしれません。

于 2012-07-27T15:08:24.880 に答える