簡體   English   中英

使用大列表時出現System.OutOfMemoryException

[英]System.OutOfMemoryException while working with large Lists

我有一個代碼:

this.weights_StoA = new List<List<double>>();

if (NETWORK_MODE == 0)
{
    Random rand = new Random();

    int count = enters.Count;

    Parallel.For(0,  HIDDEN_NEURONS_COUNT, (i, loopState) =>
    {
        List<double> weights = new List<double>();

        for (int j = 0; j < count; j++)
        {
            weights.Add(rand.NextDouble());
        }

        lock (weights_StoA)
        {
            weights_StoA.Add(weights);
        }
    });
}

weights_StoA是一個List<List<double>>

我正在處理大型陣列。 HIDDEN_NEURONS_COUNT = 63480, entres.Conut = 126960 此代碼引發System.OutOfMemoryException 我試圖將體系結構更改為x64,但是它仍然拋出相同的異常。

我該如何解決? 如果您能幫助我解決這個問題,我將不勝感激!

忽略程序需要超過100GB RAM的事實,如果您事先知道列表的大小,則可以預先分配它或使用固定大小的數組:這避免了動態調整大小和重新分配:

List<double> weights = new List<double>( count );
for( int j = 0; j < count; j++ )
{
     weights.Add( rand.NextDouble() );
}

要么:

double[] weights = new double[count];
for( int j = 0; j < count; j++ )
{
     weights[j] = rand.NextDouble();
}

.Net垃圾收集器不會壓縮大型對象,以免影響性能。 因此,您有2個選擇:

  1. 為大型數據分配一次陣列。

  2. 定期將屬性GCSettings.LargeObjectHeapCompactionMode的值設置為GCLargeObjectHeapCompactionMode.CompactOnce 下一個GC調用將處理大對象,並且將重置為默認值。 參見https://msdn.microsoft.com/zh-cn/library/system.runtime.gcsettings.largeobjectheapcompactionmode(v=vs.110).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM