Framework de l'entité: Optimisation de grands inserts de jeu de données
L'insertion efficace de grands ensembles de données dans le cadre d'entité est crucial pour les performances. Un défi commun survient lors de l'utilisation de TransactionScope
avec un grand nombre d'enregistrements (par exemple, 4000), dépassant potentiellement le délai d'expiration de la transaction par défaut (10 minutes). La clé est d'éviter les appels fréquents à SaveChanges()
, ce qui ralentit considérablement le processus.
Plusieurs stratégies peuvent améliorer considérablement la vitesse d'insertion en vrac:
SaveChanges()
: Au lieu d'économiser après chaque enregistrement, appelez SaveChanges()
Une fois que tout a été ajouté au contexte. SaveChanges()
: Appelez SaveChanges()
après un nombre prédéterminé d'enregistrements (par exemple, 100 ou 1000). SaveChanges()
, disposer du contexte et en créer un nouveau. Cela efface le suivi du changement du contexte, améliorant encore les performances. La désactivation du suivi des changements (AutoDetectChangesEnabled = false
) augmente également l'efficacité pendant les opérations en vrac.
Exemple d'implémentation:
Le code suivant démontre une approche d'insert en vrac haute performance à l'aide de lots et de recyclage de contexte:
<code class="language-csharp">using (TransactionScope scope = new TransactionScope()) { MyDbContext context = null; try { context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; int count = 0; foreach (var entityToInsert in someCollectionOfEntitiesToInsert) { ++count; context = AddToContext(context, entityToInsert, count, 1000, true); // Commit every 1000 records } context.SaveChanges(); } finally { context?.Dispose(); } scope.Complete(); } private MyDbContext AddToContext(MyDbContext context, Entity entity, int count, int commitCount, bool recreateContext) { context.Set<Entity>().Add(entity); if (count % commitCount == 0) { context.SaveChanges(); if (recreateContext) { context.Dispose(); context = new MyDbContext(); context.Configuration.AutoDetectChangesEnabled = false; } } return context; }</code>
Cet exemple engage tous les 1000 enregistrements et recrée le contexte après chaque validation. L'expérimentation peut révéler que différentes valeurs commitCount
(par exemple, 100, 500, 1000) donnent des résultats optimaux en fonction de votre environnement et de vos données spécifiques. La clé consiste à trouver l'équilibre entre minimiser les appels SaveChanges()
et gérer efficacement l'utilisation de la mémoire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!