F#互动内存泄漏

问题描述:

如果我打开了FSI和粘贴如下:F#互动内存泄漏

[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 
[1..10000000];; 

我得到:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 

如果我let x =前缀同样的事情。看起来,*参考资料继续存在,不管它们可能多难以接近。有没有什么方法可以清理这些东西,而不会损失能够逐步处理数据的便利性?现在我只是重新开始清理,但不方便。

+1

有点迂腐,但吨帽子不是内存泄漏,它只是fsi的功能。 – mydogisbox 2014-10-03 18:36:42

+0

@mydogisbox根据*的说法,“当一个对象存储在内存中但不能被运行代码访问时,可能会发生内存泄漏”。在这种情况下,“它如何工作”是泄漏内存。 – Lamarth 2014-10-03 21:24:57

+0

那么,如果你执行的代码不是在fsi.exe中,而是在你自己的可执行程序中,它的行为方式也是一样的。 – Petr 2014-10-03 21:56:40

既然你愿意用let x = [1..10000000]然后使用:

let mutable x = [1..10000000];; 

和重用数据存储器使用:

x <- [1..10000000];; 

,并释放该数据存储器使用:

x <- [];; 
+0

太棒了!我所需要做的就是'System.GC.Collect();;'这一切都消失了!如果我有耐心,它可能会自行消失。 – Lamarth 2014-10-03 21:37:41

+0

好吧,它比这更复杂。 “x Lamarth 2014-11-26 13:39:33

我不认为有一种方法可以清除FSI中的*参考。您可以增加FSI可以使用64位模式处理的内存量,但F#交互式进程的模式。 在VisualStudio中是“工具 - 选项 - F#工具 - > F#互动”设置

+0

实际上,我实际上使用fsianycpu.exe,并且当它通过20GB左右的内存咀嚼时,我必须重新启动。 – Lamarth 2014-10-03 21:19:47

+0

然后使用可变变量作为@jyoung建议可能可以做的窍门 – Petr 2014-10-03 21:42:58