2011-12-20 5 views
9

anh có chữ "'System.OutOfMemoryException" ngoại lệ cho mã này đơn giản (một ma trận 10 000 * 10 000) nhân với chính nó:Out of ngoại lệ bộ nhớ cho một ma trận

#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 

Tôi có lỗi sau:

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 

tôi có do đó 2 câu hỏi:

  1. tôi có một bộ nhớ 8 GB trên máy tính của tôi và theo c của tôi alculation một ma trận 10 000 * 10 000 nên 381 MB [tính theo cách này: 10 000 * 10 000 = 100 000 000 số nguyên trong ma trận =>100 000 000 * 4 bytes (integers of 32 bits) = 400 000 000 => 400 000 000/(1024*1024) = 381 MB] vì vậy tôi không thể hiểu tại sao có một OutOfMemoryException

  2. Tổng quát hơn (nó không phải là trường hợp ở đây tôi nghĩ), Tôi có ấn tượng rằng F # tương tác đăng ký tất cả các dữ liệu và do đó quá tải bộ nhớ, bạn có biết cách để giải phóng tất cả các dữ liệu được đăng ký bởi F # tương tác mà không thoát F #?

+9

Bạn có nhiều * bộ nhớ tùy ý * trong máy của mình; nhớ, không gian đĩa cũng là bộ nhớ. RAM chip chỉ là một cách nhanh chóng để bộ nhớ cache bộ nhớ đĩa. Bạn có thể có 8GB hoặc .5 GB hoặc 1000GB bộ nhớ vật lý; nó hoàn toàn không liên quan. Bộ nhớ bạn đang sử dụng là * không gian địa chỉ ảo cho mỗi quá trình * và không có gì liên quan đến dung lượng RAM hoặc dung lượng đĩa bạn có. –

Trả lời

14

Tóm lại, fsia 32-bit process; nhiều nhất nó có thể chứa 2GB dữ liệu. Chạy thử nghiệm của bạn dưới dạng ứng dụng Windows 64 bit; bạn có thể tăng kích thước của ma trận, nhưng nó vẫn có 2GB limit of .NET objects.

Tôi sửa tính toán của bạn một chút. Matrix1float matrix, vì vậy mỗi phần tử chiếm 8 byte trong bộ nhớ. Tổng kích cỡ của Matrix1matrix4 trong bộ nhớ là ít nhất:

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

(bỏ qua một số bộ phận kế toán của matrix)

Vì vậy, nó không có gì ngạc nhiên khi fsi*32 chạy ra khỏi bộ nhớ trong trường hợp này.

Thực hiện thử nghiệm dưới dạng quy trình Windows 64 bit, bạn có thể tạo float ma trận có kích thước khoảng 15000 nhưng không nhiều hơn thế. Kiểm tra this informative article để biết số liệu cụ thể với các loại phần tử ma trận khác nhau.

+0

Có một bài viết ở đây giải thích cách chạy fsi như quá trình 64 bit: http://ig2600.blogspot.com/2010/05/making-fsharp-interpreter-fsi-run-in.html Hoặc bạn có thể biên dịch mã F # của bạn và theo mặc định nó sẽ chạy như một quá trình 64 bit trên một hệ điều hành 64 bit. – Robert

9

Số lượng bộ nhớ vật lý trên máy tính của bạn không phải là nút cổ chai có liên quan - xem Eric Lippert's great blog post để biết thêm thông tin.