处理大型列表时出现System.OutOfMemoryException

时间:2016-12-11 09:47:07

标签: c# .net out-of-memory task-parallel-library

我有一个代码:

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_StoAList<List<double>>

我使用大型数组。 HIDDEN_NEURONS_COUNT = 63480, entres.Conut = 126960。此代码抛出System.OutOfMemoryException。我试图将架构更改为x64但它仍然会抛出相同的异常。

我该如何解决这个问题?如果你能帮助我解决这个问题,我将非常感激!

2 个答案:

答案 0 :(得分:2)

忽略你的程序需要超过100GB的RAM才能运行的事实,如果事先知道列表的大小,那么要预先分配它或使用固定大小的数组:这样可以避免动态调整大小和重新分配:

oncomplete

或:

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

答案 1 :(得分:0)

.Net garbagge收集器不压缩大型物体以避免性能影响。因此,您有两个选择:

  1. 为大数据分配一次数组。

  2. 定期将属性GCSettings.LargeObjectHeapCompactionMode的值设置为GCLargeObjectHeapCompactionMode.CompactOnce。下一次GC调用将处理大对象,并将重置为默认值。请参阅https://msdn.microsoft.com/en-us/library/system.runtime.gcsettings.largeobjectheapcompactionmode(v=vs.110).aspx