Исключение из памяти для матрицы
У меня есть исключение "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 вопроса:
-
У меня на компьютере 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
-
В целом (это не так, я думаю, здесь), у меня создается впечатление, что F # interactive регистрирует все данные и поэтому перегружает память, знаете ли вы способ освобождения всех данных, зарегистрированных F # interactive без выхода из F #?
Ответы
Ответ 1
Таким образом, 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
, но не более того. Отметьте эту информативную статью для конкретных номеров с различными типами матричных элементов.
Ответ 2
Объем физической памяти на вашем компьютере не является узким местом - см. Eric Lippert отличный пост в блоге для получения дополнительной информации.