2011-10-21 8 views
21

In un sistema operativo a 32 bit, in cui la memoria massima assegnata a un singolo programma è limitata, Mathematica termina con garbo il kernel e restituisce un errore di allocazione di memoria massimo.Modo corretto per limitare l'utilizzo della memoria Mathematica?

Su un sistema operativo a 64 bit, tuttavia, Mathematica utilizzerà liberamente tutta la memoria disponibile e interromperà il sistema. Pertanto, qual è il modo corretto per limitare l'utilizzo della memoria? Uno potrebbe usare MemoryConstrained combinato con $Pre o CellEvaluationFunction ma preferirei non legare nessuno di quelli per questo scopo, o dover modificare gli usi esistenti per incorporare questa funzione.

Esiste un altro modo per limitare a livello globale l'utilizzo della memoria, ad esempio un flag del kernel o un sistema $ Option?

+1

Un buon sistema operativo dovrebbe essere in grado di presentare al programma utente una vista gestito delle risorse, tra cui la CPU e la memoria. –

+0

@belisarius parla chiaramente uomo, cosa stai dicendo? ;-) C'è un'opzione per impostare la RAM massima in Windows 7? Ovviamente questo presuppone che Windows sia buono ... –

+3

Stavo parlando di _buoni sistemi operativi;) ... No, davvero non so su Win7 –

risposta

14

In Mathematica 8 si potrebbe iniziare un cane da guardia di memoria, qualcosa sulla falsariga di:

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

ricordarsi di eseguire

RemoveScheduledTask[ScheduledTasks[]]; 

per disattivarlo.

Modifica

Si può avvisare o in modo interattivo decidere cosa fare prima di uscire. Come richiesto, ecco una versione di prova con 1,3 GB allocati. Non posso andare molto oltre rispetto a questa macchina.

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

Modifica riconosciuta. Se possiamo ottenere conferma che funziona su altri sistemi operativi, accetterò la risposta. Grazie ancora. –

+0

@belisarius +1 Idea interessante. Questa funzione può essere estesa per riavviare il kernel con lo stesso o il nuovo codice se la sessione precedente non era una nuova sessione di MathKernel? –

+0

@Alexey Davvero non lo so :( –