矩阵的内存不足异常

kat*_*r75 9 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
Run Code Online (Sandbox Code Playgroud)

我有以下错误:

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
Run Code Online (Sandbox Code Playgroud)

因此我有两个问题:

  1. 我的计算机上有8 GB内存,根据我的计算,10 000*10 000矩阵应该占用381 MB [以这种方式计算:10 000 * 10 000 = 100 000 000矩阵中的整数=> 100 000 000 * 4 bytes (integers of 32 bits) = 400 000 000 => 400 000 000 / (1024*1024) = 381 MB]所以我无法理解为什么有一个OutOfMemoryException

  2. 更一般地说(我认为并非如此),我的印象是F#interactive注册所有数据并因此重载内存,你知道如何在不退出F#的情况下释放F#interactive注册的所有数据吗?

pad*_*pad 14

总之,fsi一个32位进程 ; 最多可以容纳2GB的数据.将测试作为64位Windows应用程序运行; 你可以增加矩阵的大小,但它仍然有2GB的.NET对象限制.

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

2 * 10000 * 10000 * 8 = 1 600 000 000 bytes ~ 1.6 GB
Run Code Online (Sandbox Code Playgroud)

(忽略一些簿记部分matrix)

因此,fsi*32在这种情况下耗尽内存并不奇怪.

以64位Windows进程执行测试,您可以创建float大小15000但不超过该大小的矩阵.查看这篇内容丰富的文章,了解具有不同类型矩阵元素的具体数字.


kvb*_*kvb 9

您计算机上的物理内存量并不是相关的瓶颈 - 有关详细信息,请参阅Eric Lippert的精彩博文.