From 86ffead75ee7d29fe7f1f66b504ac0ad3d1e55ee Mon Sep 17 00:00:00 2001 From: Ben Walch Date: Wed, 8 Oct 2025 12:24:17 +0200 Subject: [PATCH 1/3] fix memory issue when dealing with large object lists --- UPGRADE.md | 2 ++ src/Service/Builder/ObjectListBuilder.php | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/UPGRADE.md b/UPGRADE.md index e7acfbb..5d147cb 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -1,5 +1,7 @@ # Upgrade Notes +## 3.0.3 +- [IMPROVEMENT] fix memory issue when dealing with large object lists (#41) ## 3.0.2 - [LICENSE] Dual-License with GPL and Dachcom Commercial License (DCL) added ## 3.0.1 diff --git a/src/Service/Builder/ObjectListBuilder.php b/src/Service/Builder/ObjectListBuilder.php index 2a62d54..1d24c95 100644 --- a/src/Service/Builder/ObjectListBuilder.php +++ b/src/Service/Builder/ObjectListBuilder.php @@ -32,10 +32,14 @@ public function buildByList(array $options): \Generator { $list = $this->getList($options); - foreach ($list->loadIdList() as $id) { - if ($object = DataObject::getById($id)) { + $idList = $list->loadIdList(); + for ($i = 0; $i < count($idList); $i++) { + if ($object = DataObject::getById($idList[$i])) { yield $object; } + if ($i % 400 === 0) { + \Pimcore::collectGarbage(); + } } } From 09aa5b66b7b01b327091607f5f33ecf271c08c8e Mon Sep 17 00:00:00 2001 From: Ben Walch Date: Thu, 9 Oct 2025 08:33:36 +0200 Subject: [PATCH 2/3] fix memory issue when dealing with large asset and document lists --- UPGRADE.md | 2 +- src/Service/Builder/AssetListBuilder.php | 8 ++++++-- src/Service/Builder/DocumentListBuilder.php | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/UPGRADE.md b/UPGRADE.md index 5d147cb..921825d 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -1,7 +1,7 @@ # Upgrade Notes ## 3.0.3 -- [IMPROVEMENT] fix memory issue when dealing with large object lists (#41) +- [IMPROVEMENT] fix memory issue when dealing with large lists (assets, documents, objects) (#41) ## 3.0.2 - [LICENSE] Dual-License with GPL and Dachcom Commercial License (DCL) added ## 3.0.1 diff --git a/src/Service/Builder/AssetListBuilder.php b/src/Service/Builder/AssetListBuilder.php index b32f246..87636dc 100644 --- a/src/Service/Builder/AssetListBuilder.php +++ b/src/Service/Builder/AssetListBuilder.php @@ -32,10 +32,14 @@ public function buildByList(array $options): \Generator { $list = $this->getList($options); - foreach ($list->loadIdList() as $id) { - if ($asset = Asset::getById($id)) { + $idList = $list->loadIdList(); + for ($i = 0; $i < count($idList); $i++) { + if ($asset = Asset::getById($idList[$i])) { yield $asset; } + if ($i % 400 === 0) { + \Pimcore::collectGarbage(); + } } } diff --git a/src/Service/Builder/DocumentListBuilder.php b/src/Service/Builder/DocumentListBuilder.php index f8e3ab9..d9fc5ca 100644 --- a/src/Service/Builder/DocumentListBuilder.php +++ b/src/Service/Builder/DocumentListBuilder.php @@ -32,10 +32,14 @@ public function buildByList(array $options): \Generator { $list = $this->getList($options); - foreach ($list->loadIdList() as $id) { - if ($doc = Document::getById($id)) { + $idList = $list->loadIdList(); + for ($i = 0; $i < count($idList); $i++) { + if ($doc = Document::getById($idList[$i])) { yield $doc; } + if ($i % 400 === 0) { + \Pimcore::collectGarbage(); + } } } From f7ed3a1eb946cb7905d386a0140264eb61574bb8 Mon Sep 17 00:00:00 2001 From: Ben Walch Date: Thu, 9 Oct 2025 09:08:09 +0200 Subject: [PATCH 3/3] array length in variable in for loops --- src/Service/Builder/AssetListBuilder.php | 3 ++- src/Service/Builder/DocumentListBuilder.php | 3 ++- src/Service/Builder/ObjectListBuilder.php | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Service/Builder/AssetListBuilder.php b/src/Service/Builder/AssetListBuilder.php index 87636dc..d7a5325 100644 --- a/src/Service/Builder/AssetListBuilder.php +++ b/src/Service/Builder/AssetListBuilder.php @@ -33,7 +33,8 @@ public function buildByList(array $options): \Generator $list = $this->getList($options); $idList = $list->loadIdList(); - for ($i = 0; $i < count($idList); $i++) { + $length = count($idList); + for ($i = 0; $i < $length; $i++) { if ($asset = Asset::getById($idList[$i])) { yield $asset; } diff --git a/src/Service/Builder/DocumentListBuilder.php b/src/Service/Builder/DocumentListBuilder.php index d9fc5ca..69fae90 100644 --- a/src/Service/Builder/DocumentListBuilder.php +++ b/src/Service/Builder/DocumentListBuilder.php @@ -33,7 +33,8 @@ public function buildByList(array $options): \Generator $list = $this->getList($options); $idList = $list->loadIdList(); - for ($i = 0; $i < count($idList); $i++) { + $length = count($idList); + for ($i = 0; $i < $length; $i++) { if ($doc = Document::getById($idList[$i])) { yield $doc; } diff --git a/src/Service/Builder/ObjectListBuilder.php b/src/Service/Builder/ObjectListBuilder.php index 1d24c95..31e42be 100644 --- a/src/Service/Builder/ObjectListBuilder.php +++ b/src/Service/Builder/ObjectListBuilder.php @@ -33,7 +33,8 @@ public function buildByList(array $options): \Generator $list = $this->getList($options); $idList = $list->loadIdList(); - for ($i = 0; $i < count($idList); $i++) { + $length = count($idList); + for ($i = 0; $i < $length; $i++) { if ($object = DataObject::getById($idList[$i])) { yield $object; }