2012-03-17 17 views
1

なぜ私が本当に直感的ではないのですか?なぜflush()の後にメモリが減少する代わりに増加するのですか?私はドキュメンテーションで何か役に立つものを見つけることができません。私は50ループの繰り返しごとにフラッシュしていき、フラッシュメモリの使用量が1MB増えた後にフラッシュしています。 100回のフラッシュは100MBを使用します!私はここで何が欠けていますか?私はdoctrineのWebサイトの例をclear()で見たことがありますが、私が使っていると、私のオブジェクトの1つにカスケード永続性が設定されていないという例外があります。背後で何が行われているのか誰にも分かりませんが、私はすべての教義の目的を正しく取り除くために何をすべきですか?doctrine 2.1:メモリ使用量がフラッシュ後に増加しました

答えて

3

問題は、エンティティマネージャがすべてのオブジェクトを処理することです。もしあなたが各X反復後にラムにオブジェクトを必要としないなら、それをリセットするべきです。これを試してみてください:

// get the entity manager and save objects and flush 
$em = $this->get('doctrine')->getEntityManager(); 
... 
$em->flush(); 

// then reset the entity manager 
$this->get('doctrine')->resetEntityManager(); 
3

また、ここで読む:http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html

をそれは$ EM-を使用することを示唆している>クリア()操作のすべてのバルク後。 (これはBesnikが提案したのと同じ効果をもたらすはずです)。前述のリンクから

:教義で

バルクインサートが最高 のEntityManagerのトランザクションの遅延書き込み動作の 利用して、バッチで実行されます。次のコードは、バッチサイズが20の10000 オブジェクトを挿入する例を示しています。最適なサイズを見つけるには、 バッチサイズを試す必要があります。より大きいバッチ サイズは、内部でより多くの準備文の再利用を意味しますが、フラッシュ中にはさらに の作業を意味します。

0

私は、一括レコード(100K以上)を挿入すると同様の状況がありました。私はRauniとBesnikの提案とDoctrineのバッチ処理のガイドに従っていましたが、$ em-> clear()とresetEntityManager()の後でさえメモリはまだ増加しました。

ORMツールが大量の挿入、更新または削除 のため、主に非常に適していない。数日後、私はDoctrineのマニュアルの情報通知を率います。すべてのRDBMSには、 のような操作を処理する最も効果的な方法があります。下記のオプションが十分でない場合は、 RDBMSのツールを使用することをお勧めします。

を使用し、生のSQL(MySQL)を使用して挿入をバッチしました。メモリ使用量はDoctrineで200MBを超え、生のSQLでは30MBになりました。ソース配列から挿入される要素をポップすると、メモリ使用量が減少することがわかりました。また、220秒から20秒まで、はるかに速くなります。

関連する問題