2013-03-05 49 views
2

我創建了一個命令來爲我的應用程序創建事件。該命令創建超過700個事件,一切都很好。symfony2命令太多的數據內存限制

但每個事件應該有超過250位客人。這意味着,我必須在一個PHP過程中插入更多的175000個客人。

我已閱讀了許多關於批處理和性能優化的內容,以便開展此項工作。

但是建築物需要太多的記憶和創作花費了很多時間。 我測試過的沒有改變改善了性能。

有沒有人有一個想法,我可以創建我的數據?

下面是代碼:

// create Events 
. 
. 
. 
$events = array(); //List of Events load from the database 
$amountG = 250; 
$countGuests = 0; 
foreach($events as $event){ 

    for($i=0;$i<$amountG;$i++){     

     $guest = null; 
     $guest = $this->createGuest($event); //creates a guest object with random testdata     
     $countGuests++; 
     $guest->setPublickey(PublickeyUtils::generatePublickey($countGuests)); 
     $em->persist($guest); 
     if($countGuests%5000 == 0){    
      $em->flush();    
      $em->clear();    
      gc_collect_cycles(); 
     } 

     $glEntry = null; 
     unset($glEntry); 
    }    
    $event = null; 
    unset($event); 
} 

$em->flush();    
$em->clear();    

每次沖水需要3%的內存,所以這意味着,所有的參賽作品175.000永遠不會被刷新,因爲已達到內存限制。

並且每5000個條目需要超過10秒。增加刷新量會讓我更慢。

我還做了什麼是調用腳本與選項--env=prod and -no-debug以防止日誌記錄。

什麼是使其工作更高效的最佳途徑?

+0

我不明白,爲什麼在事件實體的負荷 - 他們不是在循環中使用的 - 我會建議他們採取了很多的內存 - 查看[this](http://www.doctrine-project.org/blog/doctrine2-batch-processing.html#mass-object-processing)處理對象 - 當它們加載和分離對象時已被使用 – ManseUK 2013-03-05 09:24:09

+0

對不起,我忘記了客人與事件有關係。所以我需要這個實體。 – 2013-03-05 09:27:51

+0

你可以在每個循環中跨越一個php進程,或者使用Messaging(MQ; ..) – mpm 2013-03-05 09:36:46

回答

0

根據你目前的設置,你也可以考慮增加php的memory limit

+0

沒有memeory限制設置。 – 2013-03-06 15:02:53

+0

總是有,如果你沒有明確設置,它將根據手冊頁的默認值設置:當前128M,PHP 5.2.0前8M,PHP 5.2.0中16M。 'phpinfo();'告訴你什麼? – 2013-03-06 15:22:33

+0

ini_get('memory_limit')是-1。這意味着沒有內存限制。 – 2013-03-07 08:52:04

0

解決方案IST使刀片沒有任何對象:

$em->getConnection()->insert('entity', $array);