Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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
Vb.net ILNumerics中意外的OutOfMemoryException_Vb.net_Memory Management_Memory Leaks_Garbage Collection_Ilnumerics - Fatal编程技术网

Vb.net ILNumerics中意外的OutOfMemoryException

Vb.net ILNumerics中意外的OutOfMemoryException,vb.net,memory-management,memory-leaks,garbage-collection,ilnumerics,Vb.net,Memory Management,Memory Leaks,Garbage Collection,Ilnumerics,下面的VB.net代码给出了一个内存不足异常。有人知道为什么吗 Dim vArray As ILArray(Of Double) = ILMath.rand(10000000) Using ILScope.Enter(vArray) For i As Integer = 1 To 100 vArray = ILMath.add(vArray, vArray) Next End Using 非常感谢。在这个玩具示例中,您只需删除人工范围,它就会正常运行: Dim vArr

下面的VB.net代码给出了一个内存不足异常。有人知道为什么吗

Dim vArray As ILArray(Of Double) = ILMath.rand(10000000)

Using ILScope.Enter(vArray)
   For i As Integer = 1 To 100
     vArray = ILMath.add(vArray, vArray)
   Next
End Using

非常感谢。

在这个玩具示例中,您只需删除人工范围,它就会正常运行:

Dim vArray As ILArray(Of Double) = ILMath.rand(10000000)

For i As Integer = 1 To 100
    vArray = ILMath.add(vArray, vArray)
Next
Console.WriteLine("OK: " + vArray(0).ToString())
Console.ReadKey()
然而,在更严重的情况下,ILScope将是您的朋友。如图所示,人工作用域可确保确定性内存管理:

在范围内创建的所有数组都将在创建块后被释放 左

否则,必须依靠GC进行清理。而且,正如您所知,这涉及到一个用于大型对象的gen 2集合—在性能方面存在所有缺点

为了能够处理阵列,需要以某种方式收集和跟踪它们。这是否符合“内存泄漏”这一术语是一个哲学问题。我不会在这里讨论它。处理方法是:在指令指针超出作用域后,这些数组将得到处理:它们的内存被放入内存池,并将被重用。因此,不会触发GC

该方案对于长时间运行的操作和大数据特别有用。目前,阵列仅在作用域块离开后才被释放。因此,如果您创建的算法/循环需要的内存超过机器上的可用内存,则需要在循环过程中进行清理:

    Dim vArray As ILArray(Of Double) = ILMath.rand(10000000)

    For i As Integer = 1 To 100
        Using ILScope.Enter
            vArray.a = ILMath.add(vArray, vArray)
            ' ... 
        End Using
    Next

在这里,作用域在循环的每次迭代后都会清理内存。这将影响在循环体中指定的所有本地数组。如果我们希望一个数组值在循环迭代中幸存下来,我们可以将其
.a
属性赋值,如
vArray.a
所示

在这个玩具示例中,您只需删除人工作用域,它就会正常运行:

Dim vArray As ILArray(Of Double) = ILMath.rand(10000000)

For i As Integer = 1 To 100
    vArray = ILMath.add(vArray, vArray)
Next
Console.WriteLine("OK: " + vArray(0).ToString())
Console.ReadKey()
然而,在更严重的情况下,ILScope将是您的朋友。如图所示,人工作用域可确保确定性内存管理:

在范围内创建的所有数组都将在创建块后被释放 左

否则,必须依靠GC进行清理。而且,正如您所知,这涉及到一个用于大型对象的gen 2集合—在性能方面存在所有缺点

为了能够处理阵列,需要以某种方式收集和跟踪它们。这是否符合“内存泄漏”这一术语是一个哲学问题。我不会在这里讨论它。处理方法是:在指令指针超出作用域后,这些数组将得到处理:它们的内存被放入内存池,并将被重用。因此,不会触发GC

该方案对于长时间运行的操作和大数据特别有用。目前,阵列仅在作用域块离开后才被释放。因此,如果您创建的算法/循环需要的内存超过机器上的可用内存,则需要在循环过程中进行清理:

    Dim vArray As ILArray(Of Double) = ILMath.rand(10000000)

    For i As Integer = 1 To 100
        Using ILScope.Enter
            vArray.a = ILMath.add(vArray, vArray)
            ' ... 
        End Using
    Next

在这里,作用域在循环的每次迭代后都会清理内存。这将影响在循环体中指定的所有本地数组。如果我们希望一个数组值在循环迭代中幸存下来,我们可以将其
.a
属性赋值,如
vArray.a
所示

“内存泄漏”和“内存不足异常”是非常不同的事情。如果不使用ILScope.Enter(vArray),如何?这是否会将所有数组都保留在内存中,直到
使用
结束?rand(10000000)尝试创建一个包含10^14个元素的矩阵。我不知道这是否是有意的,但很难实现,不?非常感谢你的回答。使用ILScope.Enter(vArray)
删除
,没有帮助
ILMath.rand(10000000)
创建一个10^7的向量,该向量很容易放入内存。通过调试,我知道第一次分配是有效的。同样,前10次迭代也没有问题。只有在第11次迭代中,我才得到内存不足异常。因此,代码似乎在每次迭代中分配内存,而不释放旧内存。据我所知,这被称为内存泄漏。“内存泄漏”和“内存不足异常”是非常不同的事情。如果不使用ILScope.Enter(vArray)
,如何?这是否会将所有数组都保留在内存中,直到
使用
结束?rand(10000000)尝试创建一个包含10^14个元素的矩阵。我不知道这是否是有意的,但很难实现,不?非常感谢你的回答。使用ILScope.Enter(vArray)
删除
,没有帮助
ILMath.rand(10000000)
创建一个10^7的向量,该向量很容易放入内存。通过调试,我知道第一次分配是有效的。同样,前10次迭代也没有问题。只有在第11次迭代中,我才得到内存不足异常。因此,代码似乎在每次迭代中分配内存,而不释放旧内存。据我所知,这就是所谓的内存泄漏。