Vb.net ILNumerics中意外的OutOfMemoryException
下面的VB.net代码给出了一个内存不足异常。有人知道为什么吗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
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次迭代中,我才得到内存不足异常。因此,代码似乎在每次迭代中分配内存,而不释放旧内存。据我所知,这就是所谓的内存泄漏。