ブーストエンティティフレームワーク大きなデータセットを使用してパフォーマンスを挿入します
エンティティフレームワークへの大規模なデータ挿入は、重要なパフォーマンスボトルネックとトランザクションタイムアウトにつながる可能性があります。 この記事では、このプロセスを最適化するための戦略の概要を説明しています コールを最小限に抑える:
各挿入が効率を大幅に低下させた後、SaveChanges()
への呼び出しを繰り返します。 代わりに、これらの手法を使用してください:
SaveChanges()
SaveChanges()
通常の間隔でSaveChanges()
savechanges()間隔で、添付のエンティティを解除するためにコンテキストを処分して再作成します。
キーパフォーマンスチューニングパラメーター:
using (TransactionScope scope = new TransactionScope()) { MyDbContext context = null; try { context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in largeDataset) { ++count; context = AddToContext(context, entityToInsert, count, 100, true); } context.SaveChanges(); } finally { if (context != null) context.Dispose(); } scope.Complete(); } private MyDbContext AddToContext(MyDbContext context, Entity entity, int count, int batchSize, bool recycleContext) { context.Set<Entity>().Add(entity); if (count % batchSize == 0) { context.SaveChanges(); if (recycleContext) { context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; }
:
システムの最適なバッチサイズを見つけるための値(例:100-1000)を実験してください。batchSize
コンテキストのリサイクルは、追跡されたエンティティをクリアすることでパフォーマンスを改善します。 これがあなたの特定のシナリオで利益をもたらすかどうかを判断するためのテスト。
recycleContext
これらのベストプラクティスを実装することにより、エンティティフレームワークの挿入パフォーマンスを劇的に改善し、大規模なデータセットを操作するときにタイムアウトを防ぐことができます。以上が大規模なデータセットのエンティティフレームワークインサートを最適化し、タイムアウトを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。