Was ich damit meine ist - gibt es eine Möglichkeit:
$collection = $model->getCollection();
foreach ($collection as $item) {
$item->doStuff();
}
Selbst wenn die Sammlung 100.000 Zeilen hätte, würde sie immer nur eine Seite mit Zeilen aus MySQL laden und diese magisch für Sie hinter den Kulissen paginieren.
Auf den ersten Blick Varien_Data_Collection_Db::load()
scheint es nicht möglich zu sein, sondern wollte es nur überprüfen. Dies scheint etwas zu sein, das ein allgemeines Bedürfnis sein sollte.
performance
collection
kalenjordan
quelle
quelle
setPageSize
weil es semantisch ist.core/resource_iterator
Lösung die mysql-Abfrage nicht paginiert. Es lädt die gesamte Ergebnismenge auf einmal, gibt Ihnen dann aber jeweils eine Zeile, mit der Sie sich in Ihrem PHP-Code befassen müssen. Es vermeidet also Speicherfehler in PHP, löst aber irgendwann die maximale Paketgröße von mysql aus, wenn die Ergebnismenge sehr groß ist. Ich glaube, ich werde versuchen, mitsetPageSize()
Ich stimme Ben Lessani zu, dass Sie das
core/iterator
Ressourcenmodell verwenden sollten, um große Sammlungen möglichst zeilenweise zu laden .Es gibt jedoch Einschränkungen. Wie in " addAttributeToSelect funktioniert nicht mit core / resource_iterator? " Erläutert, funktioniert es nicht gut mit EAV-Modellen, wenn Sie Werte aus den Attributwerttabellen einbeziehen müssen.
Und das verknüpfte Beispiel von StackOverflow ist eigentlich nicht so gut, weil es die gleiche Abfrage mit unterschiedlichen
LIMIT
Ausdrücken wiederholt . Bei komplexen Abfragen kann dies ein Leistungsproblem darstellen. Noch wichtiger ist jedoch, dass Sie Duplikate erhalten, wenn neue Zeilen dazwischen hinzugefügt werden.Eine bessere Möglichkeit, Sammlungen in Chunks zu verarbeiten, besteht darin, zuerst alle IDs zu laden und diese IDs dann als Filter für die tatsächlich ausgelagerte Sammlung zu verwenden.
Einfaches Beispiel für Produkte:
quelle