2011-12-20 2 views
9

У меня есть «'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>[email protected]() dans C:\Users\XXXXXXX\documents\visual studio 2010\Projects\Library1\Library1\Module1.fs:line 92 
Stop due to an error 

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

  1. у меня есть ГБ памяти на моем компьютере 8 и в соответствии с моим с alculation 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 #?

+9

У вас в вашей машине есть сколько угодно * памяти *; помните, что дисковое пространство также является памятью. Чипы RAM - это просто быстрый способ кэширования дисковой памяти. У вас может быть 8 ГБ или .5 ГБ или 1000 ГБ физической памяти; это совершенно не имеет значения. Запущенная вами память - это * виртуальное адресное пространство для каждого процесса *, и это не имеет никакого отношения к тому, сколько у вас RAM или дискового пространства. –

ответ

14

Таким образом, fsi является a 32-bit process; в лучшем случае он может хранить 2 ГБ данных. Запустите тест как 64-битное приложение Windows; вы можете увеличить размер матрицы, но у нее все еще есть 2GB limit of .NET objects.

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

+0

Здесь есть статья, в которой объясняется, как запустить fsi как 64-битный процесс: http://ig2600.blogspot.com/2010/05/making-fsharp-interpreter-fsi-run-in.html Альтернативно вы можете компилировать свой код F # и по умолчанию он будет работать как 64-битный процесс в 64-битной ОС. – Robert

9

Объем физической памяти на компьютере не соответствующее узкое место - см Eric Lippert's great blog post для получения дополнительной информации.

Смежные вопросы