2017-06-23 64 views
1

私のDBからユーザのリストを選択し、それを私のサービスに渡すには、以下のスクリプトを実行しています。私は300Kのユーザーの選択のためにそれを拡張しようとしていながら、スクリプト以下Doctrine ORMのメモリ不足、PHP symfony

$qb1 = $this->getEntityManager()->createQueryBuilder(); 
    $qb1 
     ->select('send') 
     ->from('AppBundle\Entity\Subscribers', 'send') 
     ->where('DATE_FORMAT(now(), \'%e-%b-%Y\') - DATE_FORMAT(FROM_UNIXTIME(send.last_campaign), \'%e-%b-%Y\') <=360') 
     ->andwhere('send.bounced <> 1') 
     ->andwhere('send.complaint <> 1') 
     ->andwhere('s.emailaddress = send.emailaddress'); 

が30Kのユーザーのために働く

$qb = $this->getEntityManager()->createQueryBuilder(); 
    $qb 
     -> select('s') 
     -> from('AppBundle\Entity\SubscriberDetails', 's') 
     -> where($qb->expr()->not($qb->expr()->exists($qb1->getDQL()))) 
     -> setMaxResults($numcampaigns) 
    ; 
    $subscribers = $qb->getQuery()->getResult(); 

。 300kユーザーを実行すると、私は以下のエラーを受け取ります。

6.0662 132446208 15. Doctrine\ORM\Internal\Hydration\ObjectHydrator->hydrateRowData()/Applications/MAMP/htdocs/mediaff/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:165 
6.0663 132448496 16. Doctrine\ORM\Internal\Hydration\ObjectHydrator->getEntity()/Applications/MAMP/htdocs/mediaff/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:494 
6.0663 132448496 17. Doctrine\ORM\UnitOfWork->createEntity() /Applications/MAMP/htdocs/mediaff/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php:273 
6.0663 132449488 18. ReflectionProperty->setValue() /Applications/MAMP/htdocs/mediaff/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php:2586 
6.0781 132445688 19. Symfony\Component\Debug\ErrorHandler::handleFatalError()/Applications/MAMP/htdocs/mediaff/vendor/symfony/symfony/src/Symfony/Component/Debug/ErrorHandler.php:0 
6.0782 132434104 20. spl_autoload_call() /Applications/MAMP/htdocs/mediaff/vendor/symfony/symfony/src/Symfony/Component/Debug/ErrorHandler.php:613 
6.0782 132434264 21. Symfony\Component\Debug\DebugClassLoader->loadClass()/Applications/MAMP/htdocs/mediaff/vendor/symfony/symfony/src/Symfony/Component/Debug/ErrorHandler.php:613 

ここで2番目の列は私が信じるメモリです。

どうすればこの問題を解決できますか。どんな助力も高く評価されます。

+1

「memory_limit」のような回答をしたくない場合は、「まずなぜ300kユーザーを選択する必要がありますか」から始めましょう。 – Federkun

+0

間違いなく "記憶増加"の男!それらはさらなる処理のために選択される。 APIを使用して処理された情報をパートナーに送信したり、レスポンスを受信して​​解析したりします。 –

+0

ORM(さらにはPHP)は大規模なバッチ処理用に設計されていません。まったく同じ主題については、数十の他のソフィーの質問があります。 $ em-> clear()と他のいくつかのトリックでちょっとしたことをすることはできますが、実際には1つのgulpで300kのユーザーを処理していますか?起こることはありません。驚いたことに、30kも仕事に就きました。 – Cerad

答えて

0

データ処理の種類が許せば、ページネータを使用してページを繰り返し、各繰り返しをem-> clear()を呼び出してメモリ消費量を一定に保つことができます。

+1

それは私がやったことです!私のDBが "多くの接続"に起因してクラッシュを開始したため、各反復の後にem - > getConnection() - > close() –