Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理大型列表时System.OutOfMemoryException_C#_.net_Out Of Memory_Task Parallel Library - Fatal编程技术网

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我对“重新思考问题”的评论并不是一个真正的答案,因为它没有提供一个具体的解决方案。至少对于其他有类似问题的人来说,避免重新分配列表可能会为他们解决问题。