O que quero dizer com isso é - existe uma maneira de fazer:
$collection = $model->getCollection();
foreach ($collection as $item) {
$item->doStuff();
}
De tal maneira que, mesmo que a coleção tivesse 100 mil linhas, ela carregaria apenas uma página de linhas por vez no MySQL e as paginaria magicamente para você nos bastidores.
Ao olhar para Varien_Data_Collection_Db::load()
ele, não parece possível, mas só queria verificar. Parece algo que deve ser uma necessidade comum.
performance
collection
kalenjordan
fonte
fonte
setPageSize
porque é semântico.core/resource_iterator
solução realmente não pagina a consulta mysql. Carrega todo o conjunto de resultados de uma só vez, mas, em seguida, fornece uma linha de cada vez para lidar com seu código PHP. Portanto, evita falhas de memória no PHP, mas em algum momento acionará o tamanho máximo do pacote mysql, se o conjunto de resultados for muito grande. Eu acho que estou indo para tentar construir um resource_iterator Chunked abstrata agradável usandosetPageSize()
Concordo com Ben Lessani que você deve usar o
core/iterator
modelo de recursos para carregar grandes coleções uma linha por vez, se possível .No entanto, existem limitações. Conforme explicado em " addAttributeToSelect não está funcionando com core / resource_iterator? ", Ele não funciona bem com modelos EAV se você precisar incluir valores das tabelas de valores de atributos.
E o exemplo vinculado do StackOverflow na verdade não é tão bom porque repete a mesma consulta com
LIMIT
expressões diferentes . Para consultas complexas, isso pode ser um problema de desempenho, mas ainda mais importante, você receberá duplicatas se novas linhas forem adicionadas.Uma maneira melhor de lidar com coleções em blocos é primeiro carregar todos os IDs e depois usá-los como um filtro para a coleção paginada real.
Exemplo simples para produtos:
fonte