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 个选择:
为大数据分配一次数组。
定期将 属性 GCSettings.LargeObjectHeapCompactionMode
的值设置为 GCLargeObjectHeapCompactionMode.CompactOnce
。下一次 GC 调用将处理大对象,并将重置为默认值。参见 https://msdn.microsoft.com/en-us/library/system.runtime.gcsettings.largeobjectheapcompactionmode(v=vs.110).aspx
我有一个代码:
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 个选择:
为大数据分配一次数组。
定期将 属性
GCSettings.LargeObjectHeapCompactionMode
的值设置为GCLargeObjectHeapCompactionMode.CompactOnce
。下一次 GC 调用将处理大对象,并将重置为默认值。参见 https://msdn.microsoft.com/en-us/library/system.runtime.gcsettings.largeobjectheapcompactionmode(v=vs.110).aspx