2013-01-03 31 views
12

Tiêu đề nói tất cả.Dừng ngay MATLAB nếu mức sử dụng RAM vượt quá số lượng được chỉ định. Là có một cách?

Về cơ bản, tôi cảm thấy mệt mỏi vì phải thiết lập lại comp mỗi khi tôi nhầm lẫn làm cho MATLAB sử dụng một lượng RAM lớn cho một mô phỏng với nhiều tham số tôi đang tạo.

Có cách nào để làm cho nó dừng/lỗi nếu sử dụng RAM bắt đầu vượt quá một tỷ lệ phần trăm cụ thể trong tổng số RAM của tôi?

Tôi biết rằng tôi đặt thử/nắm bắt mọi nơi tôi cấp phát bộ nhớ, nhưng đây là chương trình đã được viết và cũng có thể để tham khảo trong tương lai, tôi muốn có thể chỉ đặt tham số trong phần đầu và được thực hiện với nó.

Có cách nào không?

Cảm ơn!

Trả lời

7

Sự cố bạn thấy xảy ra khi Matlab bắt đầu sử dụng bộ nhớ ảo. Bạn thường có thể giết quá trình Matlab thông qua Task Manager, nhưng điều đó không phải lúc nào cũng mong muốn. Không có công tắc nội bộ Matlab đơn giản nào sẽ giới hạn kích thước mảng tối đa trên toàn cầu, thật không may.

Những gì bạn có thể làm là làm cho kích thước tệp hoán đổi rất nhỏ, do đó Matlab không thể viết nhiều, nhưng điều này có thể ảnh hưởng đến hiệu suất của các chương trình khác. Các giải pháp khác, không phải Matlab sẽ chuyển sang Linux (nơi bạn có thể đặt giới hạn bộ nhớ cho một chương trình dễ dàng hơn, xem câu trả lời của @ BenVoigt để biết chi tiết về setting limits on both Windows and Linux) hoặc chạy mọi thứ trong máy ảo. Để tham khảo trong tương lai, trong các mô phỏng của tôi, tôi có một phương thức (subfunction, nếu bạn không muốn làm OOP) ở đầu của phân bổ trước để tính tổng dung lượng bộ nhớ ước tính cho các tham số mô phỏng (# của các phần tử của tất cả các mảng lớn, tôi sẽ sử dụng thời gian 8 để tăng gấp đôi là bộ nhớ theo byte), và điều đó sẽ gây ra lỗi khi sử dụng quá nhiều RAM.

Đây là ví dụ để kiểm tra bộ nhớ nhanh. Tôi biết rằng tôi sẽ phân bổ 3 m-by-3-by-t mảng, và 5 m-by-t mảng, tất cả trong số họ tăng gấp đôi.

maxMemFrac = 0.8; %# I want to use at most 80% of the available memory 

numElements = 3 * (m * 3 * t) + 5 * (m * t); 
numBytesNeeded = numElements * 8; %# I use double 

%# read available memory 
[~,memStats] = memory; 

if numBytesNeeded > memStats.PhysicalMemory.Available * maxMemFrac 
    error('MYSIM:OUTOFMEMORY','too much memory would be needed') 
end 
+0

Jonas, nhờ cho rằng câu trả lời, bạn có thể mô tả chi tiết hơn cách bạn đang làm/sử dụng RAM-tính-phương pháp của bạn ở đây? Tôi nghĩ rằng đó sẽ là một giải pháp khả thi nếu tôi có thể sử dụng nó. Cảm ơn. – Spacey

+0

Chuyển sang Linux? Đối với tất cả chúng ta biết, anh ta có thể đang chạy Linux rồi. –

+0

@BenVoigt Tôi đang sử dụng máy tính Windows, tôi không nghĩ chuyển sang Lunix có thể khả thi với tôi bây giờ. – Spacey

8

Bạn có thể đặt hạn ngạch bộ nhớ ảo cho nhóm quy trình. Trên Windows, hãy sử dụng đối tượng Job. Bật * nix sử dụng ulimit. Điều này làm việc với bất kỳ quá trình nào, không chỉ là MatLab.

Xem

+0

Đối tượng công việc có cho phép tạo giới hạn cho các quy trình hiện tại hay nó cũng hoạt động với bất kỳ trường hợp nào trong tương lai? – Jonas

+2

@ Jason: Nó hoạt động trên bất kỳ quy trình nào bạn thêm vào đối tượng công việc.Nó không liên tục trên file thực thi, nếu đó là ý của bạn, nhưng bạn luôn có thể viết (hoặc tải xuống; tôi chắc rằng ai đó đã viết một thứ như vậy) một launcher nhỏ để cấu hình một đối tượng công việc và bắt đầu một cá thể MatLab bên trong công việc đó. –

+0

Cảm ơn lời giải thích. Tôi sẽ sửa câu trả lời của tôi. (+1 btw). – Jonas