SORU
20 Temmuz 2009, PAZARTESİ


'Sistemi.OutOfMemoryException' hala bellek olduğunda yeterli atıldı ücretsiz

Bu benim kod:

int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];

Özel durum: Özel durum türü 'System.'Oluşturuldu. OutOfMemoryException

Hafıza 2.5 GB ücretsiz 4GB varkoşmaya başladım bu açıkça 100000000 rasgele sayılar 762mb işlemek için PC yeterli alan var. Birçok rasgele sayılar mümkün olduğunca kullanılabilir belleği verilen depolamak lazım. Üretim için gittiğimde kutuda 12 GB olacak ve onu kullanmak istiyorum.

CLR varsayılan max bellek için beni kısıtlayan başlamak mı? ve nasıl daha fazla talep edebilirim?

Güncelleme

Küçük parçalar halinde bu kırılma ve aşamalı olarak hafıza gereksinimleri ekleme sorunu nedeniyle yardımcı olacağını düşündümbellek parçalanmasıdeğil mi ama256 MB toplam ArrayList boyutu son verdiği blok boyutu ne olursa olsun alamıyorum.

private static IRandomGenerator rnd = new MersenneTwister();
private static IDistribution dist = new DiscreteNormalDistribution(1048576);
private static List<double> ndRandomNumbers = new List<double>();

private static void AddNDRandomNumbers(int numberOfRandomNumbers) {
    for (int i = 0; i < numberOfRandomNumbers; i  ) {
      ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform()));                
  }
}

Benim ana yöntem:

int blockSize = 1000000;

while (true) {
  try
  {
    AddNDRandomNumbers(blockSize);                    
  }
  catch (System.OutOfMemoryException ex)
  {
    break;
  }
}            
double arrayTotalSizeInMegabytes = (ndRandomNumbers.Count * 8.0) / 1024.0 / 1024.0;

CEVAP
20 Temmuz 2009, PAZARTESİ


Bu okumak isteyebilirsiniz: "“Out Of Memory” Does Not Refer to Physical Memory" Eric Lippert.

Velhasıl, "hafıza" gerçekten kullanılabilir hafıza miktarı çok küçük olduğu anlamına gelmez. çok basitleştirilmiş En yaygın nedeni güncel adres alanı içinde, istediği tahsisat hizmet etmek için yeterince büyük bir bellek bitişik kısmı yok. Eğer 100 blok, her 4 MB büyük varsa, bu ihtiyacın olduğu zaman sana yardım etmeyecek 5) blok.

Önemli Noktalar:

  • veriler,” bence en iyi görüntülendi. “işlem bellek dediğimiz depolama ^strong>disk üzerinde büyük bir dosya.
  • RAM sadece performans optimizasyonu olarak görülebilir
  • Sanal bellek programı tüketir miktarı gerçekten performansı çok ilgili değil < . "RAM tükeniyor" nadiren “bellek yetersiz” hata. buradan bir sonuç ^lit Bir hata yerine, depolama aslında disk üzerinde olması tam maliyet aniden alakalı olur çünkü kötü performans ile sonuçlanır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • PhoneArena

    PhoneArena

    7 NİSAN 2006
  • WK

    WK

    9 Ocak 2006