2011-12-20 22 views
9

mam „'System.OutOfMemoryException” wyjątek tego prostego kodu (10 000 • 10 000 matrycy) pomnożone przez siebie:Z wyjątkiem pamięci w matrycy

#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 

I mają następujące błąd:

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 

dlatego mam 2 pytania:

  1. mam 8 GB pamięci na moim komputerze i zgodnie z moim c alculation 10 000 * 10 000 matryca powinna wziąć 381 MB [obliczane w ten sposób: 10 000 * 10 000 = 100 000 000 całkowitymi w macierzy =>100 000 000 * 4 bytes (integers of 32 bits) = 400 000 000 => 400 000 000/(1024*1024) = 381 MB], więc nie mogę zrozumieć, dlaczego nie jest OutOfMemoryException

  2. Bardziej ogólnie (nie jest w tym przypadku myślę), Mam wrażenie, że F # interactive rejestruje wszystkie dane i dlatego przeciąża pamięć, czy znasz sposób na uwolnienie wszystkich danych zarejestrowanych przez F # interaktywny bez wychodzenia z F #?

+9

Masz dowolnie dużo * pamięci * w swoim komputerze; pamiętaj, że przestrzeń dyskowa to również pamięć. Chipy RAM to tylko szybki sposób na buforowanie pamięci dyskowej. Możesz mieć 8 GB lub 0,5 GB lub 1000 GB pamięci fizycznej; to zupełnie nieistotne. Brakująca pamięć to * procesowa wirtualna przestrzeń adresowa *, która nie ma nic wspólnego z ilością dostępnej pamięci RAM lub dysku. –

Odpowiedz

14

Podsumowując, fsi jest a 32-bit process; co najwyżej może pomieścić 2 GB danych. Uruchom test jako 64-bitowa aplikacja systemu Windows; możesz zwiększyć rozmiar macierzy, ale nadal ma ona 2GB limit of .NET objects.

Poprawię trochę twoje obliczenia. Matrix1 to float matrix, więc każdy element zajmuje 8 bajtów w pamięci. Całkowita wielkość Matrix1 i matrix4 w pamięci wynosi co najmniej:

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

(pomijając niektóre części księgowych matrix)

Więc nic dziwnego, gdy fsi*32 zabraknie pamięci w tym przypadku.

Wykonaj test jako 64-bitowy proces systemu Windows, możesz utworzyć macierze o rozmiarze float o rozmiarze około 15000, ale nie więcej. Sprawdź numery this informative article dla konkretnych liczb z różnymi typami elementów macierzy.

+0

Tutaj jest artykuł wyjaśniający, jak uruchomić fsi jako proces 64-bitowy: http://ig2600.blogspot.com/2010/05/making-fsharp-interpreter-fsi-run-in.html Alternatywnie możesz skompilować swój kod F # i domyślnie byłby uruchamiany jako proces 64-bitowy w 64-bitowym systemie operacyjnym. – Robert

Powiązane problemy