2011-10-21 35 views
21

Theo hệ điều hành 32 bit, trong đó bộ nhớ tối đa được cấp cho bất kỳ một chương trình nào bị giới hạn, Mathematica duyên dáng chấm dứt hạt nhân và trả về lỗi cấp phát bộ nhớ tối đa.Cách chính xác để sử dụng bộ nhớ Mathematica?

Tuy nhiên, trên hệ điều hành 64 bit, Mathematica sẽ tự do sử dụng tất cả bộ nhớ khả dụng và ngừng hệ thống. Vì vậy, cách chính xác để sử dụng bộ nhớ là gì? Người ta có thể sử dụng MemoryConstrained kết hợp với $Pre hoặc CellEvaluationFunction nhưng tôi không muốn kết hợp một trong hai mục đích đó hoặc phải sửa đổi các mục đích hiện có để kết hợp chức năng này.

Có cách nào khác để hạn chế sử dụng bộ nhớ toàn cầu, chẳng hạn như cờ hạt nhân hoặc hệ thống $ Option không?

+1

Một hệ điều hành tốt sẽ có thể trình bày cho các chương trình sử dụng một cái nhìn quản lý các nguồn tài nguyên của nó, bao gồm cả CPU và bộ nhớ. –

+0

@belisarius nói rõ ràng là đàn ông, bạn đang nói gì vậy? ;-) Có tùy chọn để đặt RAM tối đa trong Windows 7 không? Tất nhiên điều này giả định Windows là tốt ... –

+3

Tôi đã nói về hệ điều hành _good_;) ... Không, thực sự tôi không biết về Win7 –

Trả lời

14

Trong Mathematica 8 bạn có thể bắt đầu một cơ quan giám sát bộ nhớ, một cái gì đó dọc theo dòng:

maxMemAllowed  = 15449604; 
intervalBetweenTests = 1; (*seconds*) 
iAmAliveSignal  = 0; 
Dynamic[iAmAliveSignal] 
RunScheduledTask[ 
     If[MemoryInUse[] > maxMemAllowed , Quit[], iAmAliveSignal++],  
     intervalBetweenTests]; 

Hãy nhớ để chạy

RemoveScheduledTask[ScheduledTasks[]]; 

để vô hiệu hóa nó.

Sửa

Bạn có thể cảnh báo hoặc tương tác quyết định làm gì trước khi nghỉ việc. Theo yêu cầu, đây là bản dùng thử với 1.3GB được phân bổ. Tôi không thể đi xa hơn thế trong cái máy này.

maxMemAllowed = 1.3 1024^3; (*1.3 GB*) 
intervalBetweenTests = 1; (*Seconds*) 
iAmAliveSignal = 0; 
leyendToPrint = ""; 
Dynamic[leyendToPrint] 
RunScheduledTask[ 
    If[MemoryInUse[] > maxMemAllowed, 
    CreateDialog[CancelButton["Max Mem Reached", DialogReturn[]]]; 
    Quit[], 
    Print["Memory in use: ", MemoryInUse[]]; 
    leyendToPrint = 
    "Seconds elapsed = " <> ToString[iAmAliveSignal++]], 
    intervalBetweenTests]; 
IntegerPartitions[320, {15}]; 

enter image description here

+1

Chỉnh sửa được xác nhận. Nếu chúng tôi có thể nhận được xác nhận rằng điều này hoạt động trên các hệ điều hành khác, tôi sẽ chấp nhận câu trả lời. Cám ơn bạn một lần nữa. –

+0

@belisarius +1 Ý tưởng thú vị. Chức năng này có thể được mở rộng để khởi động lại hạt nhân với cùng một mã mới hay không nếu phiên trước đó không phải là phiên MathKernel mới? –

+0

@Alexey Tôi thực sự không biết: ( –

Các vấn đề liên quan