ホームページ > バックエンド開発 > C++ > 大規模なデータセットのエンティティフレームワークインサートを最適化するにはどうすればよいですか?

大規模なデータセットのエンティティフレームワークインサートを最適化するにはどうすればよいですか?

DDD
リリース: 2025-02-02 06:07:11
オリジナル
295 人が閲覧しました

How Can I Optimize Entity Framework Inserts for Large Datasets?

エンティティフレームワーク:大規模なデータセットインサートの最適化

大規模なデータセットをエンティティフレームワークに効率的に挿入することは、パフォーマンスに不可欠です。 多数のレコード(たとえば、4000)を使用して

を使用する場合、一般的な課題が発生し、デフォルトのトランザクションタイムアウト(10分)を超える可能性があります。 重要なのは、プロセスを大幅に遅くするTransactionScopeへの頻繁な呼び出しを避けることです。 SaveChanges()いくつかの戦略は、バルク挿入速度を劇的に改善できます:

    batch
  • 各レコードの後に​​保存する代わりに、すべてのレコードがコンテキストに追加された後、SaveChanges()に電話してください。 SaveChanges()
  • 定期的
  • SaveChanges() 事前に決められた数のレコード(例えば、100または1000)を呼び出してください。SaveChanges()
  • コンテキストリサイクル: に電話して、コンテキストを処分し、新しいものを作成します。これにより、コンテキストの変更トラッカーがクリアされ、パフォーマンスがさらに向上します。SaveChanges()
変更追跡の無効化(

)は、バルク操作中の効率を高めます。 AutoDetectChangesEnabled = false

の実装の例:

次のコードは、バッチとコンテキストのリサイクルを使用した高性能バルクインサートアプローチを示しています:

この例は、1000の記録ごとにコミットし、各コミット後にコンテキストを再現します。 実験では、異なる
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;
}
ログイン後にコピー
値(たとえば、100、500、1000)が特定の環境とデータに応じて最適な結果をもたらすことが明らかになる場合があります。 重要なのは、呼び出しの最小化とメモリの使用状況を効果的に管理することのバランスを見つけることです。

以上が大規模なデータセットのエンティティフレームワークインサートを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート