2

基本的にいくつかのテーブルからデータをプルしてインデックステーブルを作成する関数がサービスにあります。

問題は、6000を超えるレコードがあるため、永久に時間がかかり、メモリ制限に達することもあるということです。

バッチプロセスまたはWebサービスのいずれかでこれを実現できるデザインパターンまたは方法はありますか?理想的には、進捗状況に応じてユーザーを更新し続けることができるようにしたいと思います。

任意のアイデアやポインタをいただければ幸いです。

アップデート:

私が持っているテーブルは基本的にeコマースサイトの製品で使用するためのテーブルです。私は次のテーブルを持っています:

  • 商品(基本商品情報)
  • 製品の説明(説明とメタ情報)
  • 商品価格(商品の価格情報)
  • 商品画像(商品の画像情報)
  • 製品の機能(すべての製品の機能)
  • 製品オプション(任意の製品オプション)

次に、多くの結合を必要とせずに結果を検索およびフィルタリングするのをはるかに迅速かつ簡単にする目的で、これらすべてのテーブルから情報の一部を取得する製品インデックステーブルがあります。

インデックステーブルを再構築するためのメソッド/関数/プロセス/サービスを開発するための最良の方法についてのガイダンスが必要です。

4

1 に答える 1

2

インデックスを再構築する方法はわかりませんが、大きな結果セットを処理するために使用してきた方法を紹介することはできます。

$em = $this->getContainer()->get('doctrine')->getEntityManager();
$repo = $em->getRepository('MyBundle:Item');
$qb = $repo->createQueryBuilder('i') // build query ...

// get iterator for query; this way only a single row is
// hydrated at a time.
$it = $qb->getQuery()->iterate();
foreach ($it as $row) {
    // $row[0] will be the fetched entity.
    $ent = $row[0];

    // do stuff with entity ...
    // ...

    // Once you're done with the entity detach it to
    // save memory and speed up the doctrine ORM.
    // make sure you DO NOT use the detached entity
    // in any way after this call (unless you re-merge() it).
    $em->detach($row[0]);
}
于 2012-12-10T14:38:19.510 に答える