Maison > développement back-end > C++ > Comment puis-je optimiser les inserts du cadre d'entité pour les grands ensembles de données?

Comment puis-je optimiser les inserts du cadre d'entité pour les grands ensembles de données?

DDD
Libérer: 2025-02-02 06:07:11
original
242 Les gens l'ont consulté

How Can I Optimize Entity Framework Inserts for Large Datasets?

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:

  • Batch SaveChanges(): Au lieu d'économiser après chaque enregistrement, appelez SaveChanges() Une fois que tout a été ajouté au contexte.
  • périodique SaveChanges(): Appelez SaveChanges() après un nombre prédéterminé d'enregistrements (par exemple, 100 ou 1000).
  • Recyclage du contexte: Appelez 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal