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
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ınParallelOptions.MaximumDegreeOfParallelism = 2
: veya P iki CPU CPU kullanımı kullanınParallelOptions.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;
});
}
Knockout.js containerless "dosyal...
Neden't "cd" bir parti ...
Neden ekleme "" bir Dize içi...
&; Havuz" için bellek ayrılamıyor ...
Neden Rails4 destek "varlık"...