我試圖在使用Doctrine2和Symfony2夾具束的MySQL數據庫中插入大量數據(30 000+行)。我看着the right way to do it。我看到很多關於內存泄漏和主義的問題,但對我來說沒有令人滿意的答案。它經常出現Doctrine clear()
函數。內存使用情況隨着教條批量插入
所以,我做的這個各種形狀:
while (($data = getData()) {
$iteration++;
$obj = new EntityObject();
$obj->setName('henry');
// Fill object...
$manager->persist($obj);
if ($iteration % 500 == 0) {
$manager->flush();
$manager->clear();
// Also tried some sort of:
// $manager->clear($obj);
// $manager->detach($obj);
// gc_collect_cycles();
}
}
PHP內存還是去野外,在flush()
之後(我敢肯定的說)。實際上,每次刷新實體時,內存都會根據批量大小和實體的不同而有所增加,直到達到致命的允許的內存大小用盡錯誤。有一個非常小的實體,它可以工作,但內存消耗增加太多:幾MB,而它應該是KB。
clear()
,detach()
或調用GC似乎沒有任何效果。它只會清除一些KB。
我的方法有缺陷嗎?我錯過了什麼地方?這是一個錯誤嗎?
更多信息:
- 沒有
flush()
記憶幾乎沒有移動; - 降低批次不會改變結果;
- 數據來自需要進行消毒的CSV;
EDIT(局部的溶液):
@qooplmao帶來了解決方案,顯著減少內存消耗,禁用學說SQL記錄器:$manager->getConnection()->getConfiguration()->setSQLLogger(null);
然而,它仍然是異常高的和不斷增加。
您是否嘗試降低批量(500)?它會更慢,但內存密集程度更低 –
是的。我試圖降低它(100,20,1)並增加它(1000,2000,5000),沒有變化。 –
這裏只是好奇,getData()返回什麼?它在哪裏獲得信息?多少?有趣的是,選擇循環與文檔相比,我挖了它 –