矩阵的内存不足异常

时间:2011-12-20 18:21:00

标签: f# matrix out-of-memory f#-interactive

我有这个简单代码(一个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

因此我有两个问题:

  1. 我的计算机上有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

  2. 更一般地说(我认为不是这种情况),我的印象是F#interactive注册所有数据并因此重载内存,你知道一种方法来释放F#interactive注册的所有数据没有退出F#?

2 个答案:

答案 0 :(得分:14)

总之,fsia 32-bit process;最多可以容纳2GB的数据。将测试作为64位Windows应用程序运行;你可以增加矩阵的大小,但它仍然有2GB limit of .NET objects

我稍微纠正了你的计算。 Matrix1float matrix,因此每个元素在内存中占用8个字节。内存中Matrix1matrix4的总大小至少为:

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