2011-12-20 7 views
9

tengo la excepción "'System.OutOfMemoryException" para este código simple (una matriz de 10 * 10 000 000) multiplicado por sí mismo:Fuera de excepción de memoria para una matriz

#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 

tengo el siguiente error:

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 

tengo, pues, 2 preguntas:

  1. que tengo una memoria de 8 GB en mi equipo y de acuerdo a mi c ÁLCULO una matriz de 10 000 * 10 000 debería tener 381 MB [calculado de esta manera: 10 000 * 10 000 = 100 000 000 enteros en la matriz =>100 000 000 * 4 bytes (integers of 32 bits) = 400 000 000 => 400 000 000/(1024*1024) = 381 MB] así que no puedo entender por qué hay un OutOfMemoryException

  2. En términos más generales (que no es el caso aquí creo), Tengo la impresión de que F # interactivo registra todos los datos y, por lo tanto, sobrecarga la memoria, ¿conoces alguna forma de liberar todos los datos registrados mediante F # interactivo sin salir de F #?

+9

Tiene arbitrariamente mucha * memoria * en su máquina; recuerde, el espacio en el disco también es memoria. Los chips RAM son solo una forma rápida de almacenar en caché la memoria del disco. Podría tener 8GB o .5 GB o 1000GB de memoria física; es completamente irrelevante. La memoria de la que se está quedando es * espacio de direcciones virtuales * por proceso, y eso no tiene nada que ver con la cantidad de memoria RAM o espacio de disco que tiene. –

Respuesta

14

En resumen, fsi es a 32-bit process; a lo sumo puede contener 2 GB de datos. Ejecute su prueba como una aplicación de Windows de 64 bits; puede aumentar el tamaño de la matriz, pero todavía tiene 2GB limit of .NET objects.

Corrijo un poco el cálculo. Matrix1 es float matrix, por lo que cada elemento ocupa 8 bytes en la memoria. El tamaño total de Matrix1 y matrix4 en la memoria es al menos:

2 * 10000 * 10000 * 8 = 1 600 000 000 bytes ~ 1.6 GB 

(haciendo caso omiso de algunas partes de la contabilidad de matrix)

Así que no es sorpresa cuando fsi*32 se queda sin memoria en este caso.

Ejecute la prueba como un proceso de Windows de 64 bits, puede crear matrices de tamaño float alrededor de 15000 pero no más que eso. Consulte this informative article para obtener números concretos con diferentes tipos de elementos de matriz.

+0

Hay un artículo aquí que explica cómo ejecutar fsi como proceso de 64 bits: http://ig2600.blogspot.com/2010/05/making-fsharp-interpreter-fsi-run-in.html Alternativamente, puede compilar su código F # y por defecto se ejecutaría como un proceso de 64 bits en un sistema operativo de 64 bits. – Robert

Cuestiones relacionadas