SORU
8 AĞUSTOS 2011, PAZARTESİ


Paralel.Dosyalarda grup neden bir "Bellek" istisna ise büyük bir nesne ile bir sayısız ile çalışma

Veritabanında bir kayıt veritabanında saklanan görüntüleri ve sabit diskte bir dosya dönük bir veritabanı göç etmeye çalışıyorum. Parallel.ForEach işlemi using this method verileri sorgulamak için hızlandırmak için kullanmaya çalışıyordum.

Ancak OutOfMemory bir İstisna başlamıştı fark ettim. Biliyorum Parallel.ForEach sorgu toplu enumerables azaltmak için maliyet yükü varsa bir boşluk sorguları (yani kaynak daha var sonraki kayıt önbelleğe alınan bellek yaparsan bir sürü sorguları anda yerine boşluk onları. Sorunu nedeniyle bir kayıt olduğumu dönüyor 1-4 mb bayt dizisi alma neden olan tüm adres alanı için kullanılan (program gerekir vadede 86 modu olarak hedef platform olacak, 32 bit makine)

Önbelleğe alma devre dışı bırakmak veya TRAFİK için daha küçük yapmak için herhangi bir yolu var mı?


İşte sorun göstermek için örnek bir program. Bu olmalı uyulması x 86 moduna Haritayı sorunu, Eğer almak için uzun ya da gerçekleşmeyecek makinenizi yükseltmek boyut dizisi (buldum 1 << 20 alır 30 saniye benim makine ve 4 << 20 neredeyse anında)

class Program
{

    static void Main(string[] args)
    {
        Parallel.ForEach(CreateData(), (data) =>
            {
                data[0] = 1;
            });
    }

    static IEnumerable<byte[]> CreateData()
    {
        while (true)
        {
            yield return new byte[1 << 20]; //1Mb array
        }
    }
}

CEVAP
8 AĞUSTOS 2011, PAZARTESİ


Parallel.ForEach varsayılan seçeneklerigörev CPU bağımlı olduğunda iyi çalışır tek ve doğrusal ölçekler. Görev CPU bağımlı olduğunda, her şey mükemmel çalışıyor. Eğer varsa dört çekirdekli ve başka bir işlem bir çalışan varsa, o zaman Parallel.ForEach dört işlemci kullanır. Eğer dört çekirdekli bir ve bilgisayarınızda başka bir işlem varsa biri tam CPU kullanıyor, sonra Parallel.ForEach yaklaşık üç işlemci kullanır.

Ama eğer görevi CPU bağımlı değilse, o zaman Parallel.ForEach görevler, zor CPU'yu meşgul etmeye başlayan tutar. Henüz kaç tane paralel çalışan olursa olsun, her zaman daha fazla kullanılmayan CPU beygir gücü var ve bu yüzden görev oluşturma tutar.

Nasıl Senin görevin CPU bağımlı olup olmadığını söyleyebilir misiniz? Bunu inceleyerek umarım. Eğer faktoring asal sayılar, belli. Ama diğer durumlarda bu kadar açık değildir. Eğer senin görevin CPU bağımlı olup olmadığını anlamanın basit yolu ParallelOptions.MaximumDegreeOfParallelism ile paralellik maksimum derecede sınırlamak ve programınızı nasıl davrandığını gözlemlemektir. Eğer senin görevin CPU bağımlı ise dört çekirdekli bir sistemde böyle bir desen görürsünüz:

  • ParallelOptions.MaximumDegreeOfParallelism = 1: %'lik bir tam CPU CPU kullanımı kullanın
  • ParallelOptions.MaximumDegreeOfParallelism = 2: veya P iki CPU CPU kullanımı kullanın
  • ParallelOptions.MaximumDegreeOfParallelism = 4: veya 0 CPU CPU kullanımı kullanın

Eğer böyle bir davranış gösterirse varsayılan Parallel.ForEach seçenekleri kullanın ve iyi bir sonuç alabilirsiniz. Doğrusal CPU kullanımı, iyi bir görev zamanlama anlamına gelir.

Ama eğer i7, benim istihbarat üzerine örnek uygulama kaçarsam 20% CPU kullanımı hakkında ayarlamak ne olursa olsun. Neden bu? Çok bellek çöp toplayıcı konuları engelleyen tahsis ediliyor. Uygulama kaynak-bağlı ve kaynak bellek.

Aynı şekilde veritabanı sunucusuna karşı uzun süre çalışan sorguları gerçekleştiren bir I/O-bağlı görev de hiç etkili bir şekilde tüm CPU kaynaklarını yerel bilgisayardaki kullanılabilir kullanabilecektir. Ve bu gibi durumlarda Görev Zamanlayıcı" ile başlayan yeni görevler. durdurmak için ne zaman "bilmek değiştiremiyor

Eğer senin görevin bağlı CPU veya CPU kullanımı doğrusal paralellik maksimum derecede hassas değil ise, o zaman Parallel.ForEach çok fazla görevi aynı anda başlatmak için değil tavsiye. En basit yolu olduğunu belirtmek için bir sayı verir paralellik için çakışan G/Ç bağlı görevler, ama çok değil bu seni korkutur yerel bilgisayar talebi için kaynaklar ya da fazla yüklenmek herhangi bir uzak sunuculara. Deneme yanılma almak için ilgili en iyi sonuçlar:

static void Main(string[] args)
{
    Parallel.ForEach(CreateData(),
        new ParallelOptions { MaxDegreeOfParallelism = 4 },
        (data) =>
            {
                data[0] = 1;
            });
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009
  • CMTelly

    CMTelly

    2 Mayıs 2007
  • gsipek

    gsipek

    20 Temmuz 2007