SORU
9 Mayıs 2011, PAZARTESİ


En hızlı Varlık olarak Ekleme Yolu Çerçevesi

Varlık Çerçevesi eklemek için en hızlı yol arıyorum, etkin bir Current olduğu senaryo nedeniyle bu soruyorum ve ekleme büyük (4000 ). Potansiyel olarak daha 10 dakika (varsayılan işlem zaman aşımı) son olabilir, ve bu da eksik bir işlem neden olur.

Saygılar.

CEVAP
9 Mayıs 2011, PAZARTESİ


Sorunuza yorum yaptığınız yorum için:

"...SavingChanges (her biri için kayıt)..."

Bu yapabileceğiniz en kötü şey! Her kayıt için SaveChanges() Arama son derece toplu ekler yavaşlar. Çok büyük olasılıkla performansını artıracak bazı basit testler yapmak istiyorum:

  • SaveChanges() sonra TÜM kayıtları sonra Ara.
  • Örneğin 100 kayıt sonra SaveChanges() Ara.
  • Örneğin sonra SaveChanges() 100 kayıt çağrı ve bağlam atın ve yeni bir tane oluşturun.
  • Algılama devre dışı bırakın

Toplu ekler için ve böyle bir desen ile çalışan deneme duyuyorum:

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, 100, true);
        }

        context.SaveChanges();
    }
    finally
    {
        if (context != null)
            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;
}

DB içine 560.000 varlıkları (9 skaler özellikler, navigasyon özellikleri) bir test programı var. Bu kod ile en az 3 dakika içinde çalışıyor.

Önemli "çok" ("çok" yaklaşık 100 veya 1000). sonra kayıtları SaveChanges() Ara ve performans için Ayrıca SaveChanges sonra bağlam atın ve yeni bir tane oluşturmak için performansını artırır. Bu entites itibaren kapsamında, SaveChanges, varlıkları hala devlet bağlamında Unchanged bağlı olan yapmaz temizler. Adım adım ekleme yavaşlar ne bağlamında bağlı kuruluşlar artan boyutudur. Bu yüzden, bir süre sonra temizlemek için yararlıdır.

Burada 560.000 benim varlıklar için: birkaç ölçüm

  • = 1, = recreateContext yanlış: commitCountbirçok saat(Geçerli yordam)
  • = 100, = recreateContext yanlış: commitCount20 dakikadan fazla
  • = 1000, = recreateContext yanlış: commitCount242 sn
  • = 10000, = recreateContext yanlış: commitCount202 sn
  • = 100000, = recreateContext yanlış: commitCount199 sn
  • = 1000000, = recreateContext yanlış: commitCountbellek istisna dışında
  • = 1, = recreateContext gerçek: commitCount10 dakikadan fazla
  • = 10, = recreateContext gerçek: commitCount241 sn
  • = 100, = recreateContext gerçek: commitCount164 sn
  • = 1000, = recreateContext gerçek: commitCount191 sn

Yukarıda ilk test tutumu, performansı, doğrusal olmayan çok ve son derece zamanla azalır. "Saatler" bir tahmin, ben bu testi bitti, 20 dakika sonra 50.000 varlıklar uğradım.) ( Bu doğrusal olmayan davranışlar diğer tüm testlerde o kadar önemli değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Rhapsody

    Rhapsody

    7 ŞUBAT 2008
  • Shameless Maya

    Shameless Ma

    24 Mayıs 2012
  • Wronchi Animation

    Wronchi Anim

    9 Mayıs 2011