【问题标题】:MathNet Numerics out of memory exceptionMathNet Numerics 内存不足异常
【发布时间】:2013-10-30 09:59:46
【问题描述】:

我在我的 F# 项目中使用 MathNet.Numerics,但它在处理本应在其职责范围内的矩阵时内存不足。

编辑:问题绝对不在于 MathNet.Numerics。这是我正在做的事情,虽然我还没有弄清楚可能是什么。

这是我构建 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;

使用这个,

let mnistTrainingImages = loadMnistImage MnistTrainingImageData
let tr = mnistTrainingImages.Transpose()

炸了。

是他们还是我?我从http://yann.lecun.com/exdb/mnist/ 中提取了文件,以防有人想自己尝试一下。

编辑 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)

【问题讨论】:

  • 我想我受到了惰性列表评估的打击。我将切换到数组,看看会发生什么。

标签: f# math.net mathnet-numerics


【解决方案1】:

即使使用 32 位 F#3.0 FSI,以下 sn-p 对我也有效:

#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。
猜你喜欢
  • 2010-10-05
  • 1970-01-01
  • 2010-12-21
相关资源
最近更新 更多