Недостаточно памяти для матрицы - PullRequest
9 голосов
/ 20 декабря 2011

У меня есть исключение "'System.OutOfMemoryException" для этого простого кода (матрица 10 000 * 10 000), умноженное на себя:

#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

Поэтому у меня есть 2 вопроса:

  1. У меня 8 ГБ памяти на моем компьютере, и согласно моим расчетам матрица 10 000 * 10 000 должна занять 381 МБ [вычислено этопуть: 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 # Interactive, не выходя из F #?

Ответы [ 2 ]

14 голосов
/ 20 декабря 2011

В итоге fsi - это 32-битный процесс ; не более 2 ГБ данных. Запустите свой тест как 64-битное приложение Windows; Вы можете увеличить размер матрицы, но она по-прежнему имеет ограничение 2 ГБ для объектов .NET .

Я немного поправил ваш расчет. 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, но не более того. Проверьте эту информативную статью для конкретных чисел с различными типами матричных элементов.

9 голосов
/ 20 декабря 2011

Объем физической памяти на вашем компьютере не является узким местом - для получения дополнительной информации см. Великий пост Эрика Липперта в блоге .

...