Poprawny sposób na wykorzystanie pamięci Mathematica?

W 32-bitowym systemie operacyjnym, gdzie maksymalna ilość pamięci przydzielonej do dowolnego programu jest ograniczona, Mathematica z wdziękiem kończy jądro i zwraca błąd maksymalnej alokacji pamięci.

Jednak na 64-bitowym systemie operacyjnym Mathematica będzie swobodnie wykorzystywać całą dostępną pamięć i zatrzymywać system. W związku z tym, jaki jest prawidłowy sposób ograniczenia zużycia pamięci? Można by użyć MemoryConstrained w połączeniu z $Pre lub CellEvaluationFunction, ale wolałbym nie wiązać żadnego z nich w tym celu, albo muszę zmodyfikuj istniejące zastosowania, aby włączyć tę funkcję.

Czy istnieje inny sposób globalnego ograniczenia użycia pamięci, taki jak flaga jądra lub system $Option?

Author: Dr. belisarius, 2011-10-22

1 answers

W } Mathematica 8 można uruchomić pamięć, coś w stylu:

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

Pamiętaj, aby uruchomić

RemoveScheduledTask[ScheduledTasks[]];

Aby go wyłączyć.

Edit

Możesz ostrzegać lub interaktywnie decydować, co zrobić przed rzuceniem palenia. Zgodnie z życzeniem, oto próba z przydzielonym 1.3 GB. W tej maszynie nie mogę pójść dalej.

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}];

Tutaj wpisz opis obrazka

 14
Author: Dr. belisarius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 21:54:46