回答:
あなたは本当に使うべきです
Mage::getSingleton('core/resource_iterator')
この目的のために、純粋にあなたが言及したパフォーマンス上の理由のために存在します。
それ以外の場合は、ループを使用してわずかにエレガントなソリューションを使用できますsetPageSize
-ここに良い例があります、https://stackoverflow.com/questions/3786826/how-to-loop-a-magento-collection
setPageSize
それはセマンティックだから。
core/resource_iterator
ソリューションが実際にmysqlクエリをページ分割しないことです。結果セット全体を一度にロードしますが、PHPコードで処理する行を一度に提供します。したがって、PHP内のメモリフォールトを回避しますが、結果セットが非常に大きい場合、ある時点でmysqlの最大パケットサイズをトリガーします。私はsetPageSize()
私は同意するベンLessaniあなたが使用する必要のあるcore/iterator
時に大きなコレクションに1行をロードするために、リソースのモデルを、可能な場合。
ただし、制限があります。「addAttributeToSelectがcore / resource_iteratorで機能しない?」で説明したように、属性値テーブルの値を含める必要がある場合、EAVモデルではうまく機能しません。
また、StackOverflowからのリンクされた例は、異なるクエリで同じクエリを繰り返すため、実際にはそれほど良くありませんLIMIT
。複雑なクエリの場合、これはパフォーマンスの問題になる可能性がありますが、さらに重要なことは、間に新しい行が追加されると重複することです。
チャンクでコレクションを処理するより良い方法は、最初にすべてのIDをロードし、次にこれらのIDを実際のページングされたコレクションのフィルターとして使用することです。
$ids = Mage::getModel('catalog/product')
->getCollection()
->getAllIds();
$page = 1;
do {
$collection = Mage::getModel('catalog/product')
->getCollection()
->addIdFilter($ids)
->setPageSize(100)
->setCurPage($page);
$results = $collection->load();
// do stuff ......
$page++;
} while ($results->count());