2014-02-12 7 views
6

Diese Frage ist eine Folge von diesem question.Speicherleck Sicstus Prolog

Ich bin eine große Anzahl von Tests in SICStus Prolog ausgeführt wird:

runtest:- 
t1, 
t2, 
t3, 
. 
. 
t100. 

Jeder Test Standalone und wird das Ergebnis auf den Bildschirm drucken. Zwischen den Tests besteht kein Zusammenhang, so dass zwischen den einzelnen Tests keine Daten gespeichert/gespeichert werden müssen.

Mein Problem ist, dass SICStus Speicher sammelt und trifft schließlich eine Ausnahme: ‚Ressourcenfehler: nicht genügend Arbeitsspeicher‘

ich versucht habe, meinen Test so zu organisieren:

runtest:- 
    once(t1), 
    once(t2), 
    . 
    . 
    once(t100). 

Aber ich immer noch in das Problem.

Gibt es eine andere Möglichkeit, Prolog mitzuteilen, dass zwischen jedem Aufruf eines Tests der gesamte zugewiesene Speicher freigegeben wird?

Antwort

3

Versuchen Sie, einen (modernen) failure driven loop mit: sollte

?- forall(member(T, [t1,t2,...,t100]), once(T)). 
+2

Es würde eine Menge helfen, diesen Stil terminologisch von den üblichen fehlergesteuerten Schleifen zu trennen. 'findall/3',' setof/3' haben fehlerbehaftete Schleifen im Inneren. – false

+3

Es gibt keine Notwendigkeit für einmal (T), weil "T" ausreicht. – false

6

Nein, jeden Prolog auf Speicher zurückzugewinnen gibt es keine Möglichkeit Prolog zu sagen alle zugewiesenen Speicher freizugeben.

Wenn das Testprädikat keine Argumente annimmt und das Einschließen von einmal/1 nicht hilft, sollte auch eine fehlergesteuerte Schleife nicht helfen.

Eine Möglichkeit besteht darin, dass Ihre Tests irgendwie persistente Daten hinzufügen, z. behauptet Klauseln.

Versuchen Zugabe

garbage_collect, statistics

zwischen (einige) der Test. Dies sollte Ihnen eine Vorstellung davon geben, welche Speicherbereiche wachsen.

Aus der Betrachtung Ihrer früheren Frage könnte es sein, dass einer Ihrer Tests nicht genügend Speicher hat, d. H. Dass das Problem nichts mit der Ausführung mehrerer Tests zu tun hat.

+3

"rückgängig machen" könnte ein weiterer Grund sein, warum 'einmal/1' keinen Platz zurückgewinnen kann. – false

2

Das Prädikat einmal/1 schneidet nur Auswahlpunkte ab, lässt aber die Spur intakt. Die Spur wird normalerweise entweder durch variable Vereinheitlichungen oder sogar durch Einschränkungen der Beschränkungslöser erweitert.

So Ihre Kette von Tests sammelt eine Menge Daten. Es gibt eine Prolog Folklore , die Ihnen helfen würde. Mit der doppelten Negation werden Ressourcen freigegeben, daher wird dieses Konstrukt oft als Garbage Collection bezeichnet.

umschreiben Sie Ihren Code:

runtest:- 
    \+ \+ t1, 
    \+ \+ t2, 
    \+ \+ t3, 
    . 
    . 
    \+ \+ t100. 

Aber bitte beachten Sie, dass Ihr Test wird nun auch die Zeit misst den Weg abzureißen, möglicherweise alte Ergebnisse zu ändern, da irgendwann die Zeit abzureißen die Spur kann messbar sein.

Und last but not least, natürlich die Folklore Garbage Collection doppelte Negation funktioniert nur, wenn es in Ordnung ist, das Ziel einmal aufzurufen.

Tschüss