請參閱Batch Processing in Doctrine documentation。想法是在每個新實體上調用persist()
,但只有在一組n
實體持續存在後才使用flush()
。對於每個實體來說,花費的時間要少於撥打persist()
,然後flush()
。
例如:
$batchSize = 20;
for ($i = 1; $i <= 10000; ++$i) {
$user = new CmsUser;
$user->setStatus('user');
$user->setUsername('user' . $i);
$user->setName('Mr.Smith-' . $i);
$em->persist($user);
if (($i % $batchSize) === 0) {
$em->flush();
}
}
我刪除clear()
因爲它會脫離所有實體。例如,如果您將foreach() {}
與實體配合使用,則會出現問題,因爲Doctrine2會分離實體,因此循環將爲中斷。
沒有使用clear()
,Doctrine2在內存中保留所有持久化的實體,如果它佔用的內存比PHP可以使用的更多,它可能會導致錯誤。
如果您在循環中對Doctrine存儲庫以外的內容進行迭代,則可以在flush()
之後調用clear()
。
這是工作的方式是建立在一個陣列被保留和儲存所有實體。一旦XML文件被讀取,它就會遍歷數組,並在每個實體上運行「持久化」。然後它稱爲「沖洗」。我現在意識到這不是最好的方法。它應該在創建時保留每個實體,然後定期刷新。 –