C# 处理大型列表时System.OutOfMemoryException
我有一个密码:C# 处理大型列表时System.OutOfMemoryException,c#,.net,out-of-memory,task-parallel-library,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&g
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);
}
});
}
this.weights_StoA=新列表();
如果(网络模式==0)
{
Random rand=新的Random();
int count=输入.count;
并行。对于(0,隐藏神经元计数,(i,循环状态)=>
{
列表权重=新列表();
对于(int j=0;j
weights\u StoA
是一个列表
我正在使用大型阵列<代码>隐藏的神经元计数=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() );
}
列表权重=新列表(计数);
对于(int j=0;j
或:
double[]权重=新的double[count];
对于(int j=0;j
忽略您的程序需要超过100GB的RAM才能运行这一事实,如果您事先知道列表的大小,则可以预先分配它或使用固定大小的数组:这样可以避免动态调整大小和重新分配:
List<double> weights = new List<double>( count );
for( int j = 0; j < count; j++ )
{
weights.Add( rand.NextDouble() );
}
列表权重=新列表(计数);
对于(int j=0;j
或:
double[]权重=新的double[count];
对于(int j=0;j
.Net garbagge收集器不会压缩大型对象以避免性能影响。因此,您有两种选择:
GCSettings.LargeObjectHeapCompactionMode
的值设置为GCLargeObjectHeapCompactionMode.CompactOnce
。下一次GC调用将处理大型对象,并且将重置为默认值。看Net garbagge收集器不会压缩大型对象以避免性能影响。因此,您有两种选择:
GCSettings.LargeObjectHeapCompactionMode
的值设置为GCLargeObjectHeapCompactionMode.CompactOnce
。下一次GC调用将处理大型对象,并且将重置为默认值。看旁注:
Random
不是线程安全的。您的算法将分配63480*126960
(即8059420800
实例)的double
(8字节)值,即64475366400
字节或60GB字节。难怪你的内存不足。问题是,你对这个列表做了什么。您不应该使用列表,而应该使用可枚举和生产者/消费者设计模式,这样垃圾收集器就可以消除不使用数据的情况。考虑到CLR,即使在64位模式下,最大对象大小也为2 GB(),您不太可能用当前的方法解决您的程序。您应该考虑如何将问题分解成更小的部分,并使用混合的磁盘/内存表示形式来表示内存。现在很少有计算机有128GB的RAM,因为64GB不足以在实践中代表您的程序,所以您应该重新考虑这一点。缓存随机值不是很聪明吗..旁注:random
不是线程安全吗?您的算法将分配63480*126960
(即8059420800
实例)双字节(8字节)值,即64475366400字节或60G字节。难怪你的内存不足。问题是,你对这个列表做了什么。您不应该使用列表,而应该使用可枚举和生产者/消费者设计模式,这样垃圾收集器就可以消除不使用数据的情况。考虑到CLR,即使在64位模式下,最大对象大小也为2 GB(),您不太可能用当前的方法解决您的程序。您应该考虑如何将问题分解成更小的部分,并使用混合的磁盘/内存表示形式来表示内存。现在很少有计算机有128GB的RAM,因为64GB不足以在实践中代表您的程序,所以您应该重新考虑这一点。缓存随机值不是很聪明吗..为什么这是公认的答案?它将如何解决这个问题?这就像“忽略真正的问题,这种优化不会改变任何事情”,你对这个问题的评论应该标记为answer@barakcaf我对“重新思考问题”的评论并不是一个真正的答案,因为它没有提供一个具体的解决方案。至少对于其他有类似问题的人来说,避免重新分配列表可能会为他们解决问题。为什么这是一个被认可的答案?它将如何解决这个问题?这就像“忽略真正的问题,这种优化不会改变任何事情”,你对这个问题的评论应该标记为answer@barakcaf我对“重新思考问题”的评论并不是一个真正的答案,因为它没有提供一个具体的解决方案。至少对于其他有类似问题的人来说,避免重新分配列表可能会为他们解决问题。