symfony 3 итерация массива объектов слишком длинная

Я получил массив сущностей symfony3, всего 50000. Мне нужно перебрать этот массив и найти некоторые объекты, которые соответствуют определенным критериям.
код показан ниже:

$p_r = $em->getRepository('AppBundle:Product_region')->findall();//50000 elements in array
$rowid_2 = $product->getRowId();//some product entity

foreach($p_r as $pr){
$rowid_1 = $pr->getProductid()->getRowId();

if($rowid_1 == $rowid_2){
$regions[] = $pr->getRegionid()->getName();
$filial_name = $pr->getRegionid()->getFilial()->getName();

if(!in_array($filial_name, $filials)){
$filials[] =  $filial_name;
}
}
}

Проблема в том, что итерация занимает около 1 секунды, что очень долго. Для завершения операции требуется около 25% ядра ЦП 1. Я проверил его на другом массиве чисел и заметил, что для итерации 50 000 элементов понадобилось около 0,002 с. Любые идеи, как ускорить его и где искать задержку, будут приветствоваться. Спасибо.

0

Решение

Если вы хотите найти некоторые объекты, которые соответствуют определенным критериям, вы можете использовать 2 критерия Doctrine, чтобы получить эти объекты.

Я нашел это действительно полезным. Здесь у вас есть ссылка на документы Доктрины:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#filtering-collections

Надеюсь это поможет. 🙂

1

Другие решения

У вас есть два варианта. Создать регион / продукт Symfony Repository и создать finder использовать функцию QueryBuilder / DQL что вы можете указать идентификатор, который вы ищете ИЛИ использовать функции ArrayCollection и критерии для фильтрации ваших результатов.

use Doctrine\Common\Collections\Criteria;
$criteria = Criteria::create()->where(Criteria::expr()->eq('product_id', $product_id))->setFirstResult(0);
$items = $p_r->matching($criteria);

Итерация (foreach) над этим массивом объектов вызовет ленивую загрузку, которая изменит процессор / память. Проверьте код для Доктрины ArrayCollections а также критерии

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector