我有这个简单代码(一个10 000 * 10 000矩阵)的“System.OutOfMemoryException”异常乘以它自己:
#time
#r "Microsoft.Office.Interop.Excel"
#r "FSharp.PowerPack.dll"
open System
open System.IO
open Microsoft.FSharp.Math
open System.Collections.Generic
let mutable Matrix1 = Matrix.create 10000 10000 0.
let matrix4 = Matrix1 * Matrix1
我有以下错误:
System.OutOfMemoryException: An exception 'System.OutOfMemoryException' has been raised
Microsoft.FSharp.Collections.Array2DModule.ZeroCreate[T](Int32 length1, Int32 length2)
Microsoft.FSharp.Math.DoubleImpl.mulDenseMatrixDS(DenseMatrix`1 a, DenseMatrix`1 b)
Microsoft.FSharp.Math.SpecializedGenericImpl.mulM[a](Matrix`1 a, Matrix`1 b)
<StartupCode$FSI_0004>.$FSI_0004.main@() dans C:\Users\XXXXXXX\documents\visual studio 2010\Projects\Library1\Library1\Module1.fs:line 92
Stop due to an error
因此我有两个问题:
我的计算机上有8 GB的内存,根据我的计算,10 000 * 10 000矩阵应该占381 MB [以这种方式计算:矩阵中的10 000 * 10 000 = 100 000 000
整数=&gt; 100 000 000 * 4 bytes (integers of 32 bits) = 400 000 000 => 400 000 000 / (1024*1024) = 381 MB
]所以我无法理解为什么会有OutOfMemoryException
更一般地说(我认为不是这种情况),我的印象是F#interactive注册所有数据并因此重载内存,你知道一种方法来释放F#interactive注册的所有数据没有退出F#?
答案 0 :(得分:14)
总之,fsi
是a 32-bit process;最多可以容纳2GB的数据。将测试作为64位Windows应用程序运行;你可以增加矩阵的大小,但它仍然有2GB limit of .NET objects。
我稍微纠正了你的计算。 Matrix1
是float matrix
,因此每个元素在内存中占用8个字节。内存中Matrix1
和matrix4
的总大小至少为:
2 * 10000 * 10000 * 8 = 1 600 000 000 bytes ~ 1.6 GB
(忽略matrix
)的某些簿记部分
因此,fsi*32
在这种情况下耗尽内存并不奇怪。
将测试作为64位Windows进程执行,您可以创建大小为float
但不超过15000
的{{1}}矩阵。查看具有不同类型矩阵元素的具体数字this informative article。
答案 1 :(得分:9)
计算机上的物理内存量不是相关瓶颈 - 有关详细信息,请参阅Eric Lippert's great blog post。