2011-12-20 15 views
9

ho l'eccezione "'System.OutOfMemoryException" per questo semplice codice (una matrice di 10 000 * 10 000) moltiplicato per se stesso:Fuori un'eccezione di memoria per una matrice

#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 

ho il seguente errore:

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 

ho quindi 2 domande:

  1. ho un 8 GB di memoria sul mio computer e secondo la mia c ALCOLO una matrice di 10 000 * 10 000 dovrebbe prendere 381 MB [calcolato in questo modo: 10 000 * 10 000 = 100 000 000 interi nella matrice =>100 000 000 * 4 bytes (integers of 32 bits) = 400 000 000 => 400 000 000/(1024*1024) = 381 MB] in modo non riesco a capire il motivo per cui v'è un OutOfMemoryException

  2. Più in generale (non è il caso qui penso), Ho l'impressione che F # interattivo registri tutti i dati e quindi sovraccarichi la memoria, conosci un modo per liberare tutti i dati registrati da F # interattivi senza uscire da F #?

+9

Avete arbitrariamente molto * memoria * nella vostra macchina; ricorda, lo spazio su disco è anche la memoria. I chip RAM sono solo un modo veloce per memorizzare nella memoria del disco. Potresti avere 8 GB o .5 GB o 1000 GB di memoria fisica; è completamente irrilevante. La memoria che stai esaurendo è * per-process virtual address space *, e questo non ha nulla a che fare con quanta RAM o spazio su disco hai. –

risposta

14

In sintesi, fsi è a 32-bit process; al massimo può contenere 2 GB di dati. Esegui il test come applicazione Windows a 64 bit; puoi aumentare la dimensione della matrice, ma ha ancora 2GB limit of .NET objects.

Correggo un po 'il calcolo. Matrix1 è un float matrix, quindi ogni elemento occupa 8 byte in memoria. La dimensione totale di Matrix1 e matrix4 in memoria è di almeno:

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

(ignorando alcune parti di contabilità di matrix)

Quindi non è una sorpresa quando fsi*32 esaurisce la memoria in questo caso.

Eseguire il test come processo Windows a 64 bit, è possibile creare matrici di dimensioni float intorno a 15000 ma non di più. Controlla this informative article per i numeri concreti con diversi tipi di elementi matrice.

+0

C'è un articolo qui che spiega come eseguire fsi come processo a 64 bit: http://ig2600.blogspot.com/2010/05/making-fsharp-interpreter-fsi-run-in.html In alternativa puoi compilare il tuo codice F # e per impostazione predefinita funzionerebbe come un processo a 64 bit su un sistema operativo a 64 bit. – Robert

Problemi correlati