F# MathNet Numerics内存不足异常

F# MathNet Numerics内存不足异常,f#,math.net,mathnet-numerics,F#,Math.net,Mathnet Numerics,我在我的F#项目中使用MathNet.Numerics,当处理应该在其职权范围内的矩阵时,它会耗尽内存 EDIT:问题绝对不是MathNet.Numerics。这是我正在做的事情,尽管我还没有弄清楚那可能是什么。 let readImage (b : BinaryReader) = (b.ReadByte() |> int |> float)/255.0 let loadMnistImage file = use stream = File.Open(file, F

我在我的F#项目中使用MathNet.Numerics,当处理应该在其职权范围内的矩阵时,它会耗尽内存

EDIT:问题绝对不是MathNet.Numerics。这是我正在做的事情,尽管我还没有弄清楚那可能是什么。

let readImage (b : BinaryReader) =
    (b.ReadByte() |> int |> float)/255.0

let loadMnistImage file =
    use stream = File.Open(file, FileMode.Open)
    use reader = new BinaryReader(stream)
    let magicNumber = readInt(reader)
    let nImages = readInt(reader)
    let nRows = readInt(reader)
    let nCols = readInt(reader)
    Array2D.init nImages (nRows * nCols) (fun _ _ -> readImage reader)
下面是我如何构建MNIST矩阵的。也许我正在打开一个文件流或其他什么,但我看不出会是什么情况

let readInt (b : BinaryReader) =
    [1..4] |> List.fold (fun res item -> (res <<< 8) ||| (int)(b.ReadByte())) 0

let readImage (b : BinaryReader, rowArray, colArray) =
    rowArray |> List.collect (fun r -> List.map (fun c -> (b.ReadByte() |> int |> float)/255.0 ) colArray)

let loadMnistImage file =
    use stream = File.Open(file, FileMode.Open)
    use reader = new BinaryReader(stream)
    let magicNumber = readInt(reader)
    let nImages = readInt(reader)
    let nRows = readInt(reader)
    let nCols = readInt(reader)

    let row = [1..nRows]
    let col = [1..nCols]
    let images = [1..nImages] |> List.map (fun _ -> readImage(reader, row, col))
    matrix images;
爆炸了

是他们还是我?我把文件从里面拿出来,以防有人想自己试试

编辑1:罪魁祸首是调用
loadMnistImage
根据Gene Belitski的建议,我运行了代码

let rand = System.Random()
let m: double [,] = Array2D.init 60000 784 (fun _ _ -> rand.NextDouble())
排队前后

let mnistTrainingImages = loadMnistImage MnistTrainingImageData
在排队之前,天气很好;在这行之后,它爆发了相同的内存不足异常。我本以为
use
语句会释放该文件,我会没事的(这不是一个大文件)。然而,我遗漏了一些东西,所以我会继续挖掘,如果有人看到任何东西,请告诉我

编辑2:当我将文件读取器简化如下时,问题消失了。问题似乎是对列表的延迟评估。

let readImage (b : BinaryReader) =
    (b.ReadByte() |> int |> float)/255.0

let loadMnistImage file =
    use stream = File.Open(file, FileMode.Open)
    use reader = new BinaryReader(stream)
    let magicNumber = readInt(reader)
    let nImages = readInt(reader)
    let nRows = readInt(reader)
    let nCols = readInt(reader)
    Array2D.init nImages (nRows * nCols) (fun _ _ -> readImage reader)
即使使用32位F#3.0 FSI,以下代码片段对我来说也没有问题:

#if INTERACTIVE
#r @"....\packages\MathNet.Numerics.2.6.2\lib\net40\MathNet.Numerics.dll"
#endif

open MathNet.Numerics.LinearAlgebra.Double

let rand = System.Random()
let m: double [,] = Array2D.init 60000 784 (fun _ _ -> rand.NextDouble())
let mx = DenseMatrix.OfArray m
let tmx = mx.Transpose()

必须在您的设置中工作,是吗?

是的,但还有更多要说的。我现在正在编辑我的问题。谢谢你的帮助Gene--它使我能够从查询中删除MathNet。我想我被懒惰列表评估击中了。我将切换到数组,看看会发生什么。