2014-02-12 3 views
6

이 질문은이 question의 후속 조치입니다.메모리 누수 Sicstus Prolog

나는 Sicstus 프롤로그에서 테스트의 큰 숫자를 실행 해요 :

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

각각의 테스트가 독립하고 화면에 그 결과를 출력합니다. 테스트 간에는 관련성이 없으므로 각 테스트 사이에 데이터를 저장하거나 저장할 필요가 없습니다. '자원 오류 : 메모리 부족'

내가 이렇게 내 테스트를 조직하는 것을 시도했다 :

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

하지만 여전히 들어가 Sicstus 메모리를 축적하고 마지막 예외 안타 것을

내 문제입니다 문제.

각 호출 사이에 할당 된 메모리를 모두 해제하도록 Prolog에 지시하는 다른 방법이 있습니까?

답변

3

A (현대) failure driven loop 사용해보십시오 : 에 회수해야 메모리를 어떤 프롤로그

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

일반적으로이 스타일을 공통 실패 구동 루프와 구분하는 데 많은 도움이됩니다. 'findall/3','setof/3'는 내부에서 실패 구동 루프를 가지고 있습니다. – false

+3

'once (T)'는'T'만으로 충분하기 때문에 필요하지 않습니다. – false

6

없음을 모든 할당 된 메모리를 무료로 프롤로그를 알 수있는 방법이 없습니다.

테스트 조건부가 인수를 사용하지 않고 한 번/1로 감싸는 것이 도움이되지 않으면 실패 주도 루프가 도움이되지 않습니다.

하나의 가능성은 테스트에서 어떻게 든 영구 데이터를 추가한다는 것입니다. 조항을 주장합니다.

시도 (일부) 시험 사이

garbage_collect, statistics

추가. 이렇게하면 어느 메모리 영역이 성장하고 있는지 알 수 있습니다.

이전 질문을 살펴보면 테스트 중 하나에서 메모리가 모두 소모 될 수 있습니다. 즉, 여러 테스트를 실행하는 것과 관련이없는 문제 일 수 있습니다.

+3

''undo'가'once/1'가 공간을 되 찾을 수없는 또 다른 이유 일 수 있습니다. – false

2

술어는 한 번만 선택 점을 잘라 버리고 흔적을 남깁니다. 트레일은 대개 제약 조건 해결 자의 제약 조건에도 불구하고 변수 통합 또는 에 의해 확장됩니다.

따라서 테스트 체인은 많은 양의 데이터를 수집합니다. 프롤로그의 민속이 도움이 될 것입니다. 이중 부정을 사용하면 리소스가 해제되므로이 구조는 이므로 가비지 수집이라는 별칭이 될 수 있습니다.

그냥 당신의 코드를 다시 작성 :

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

그러나 테스트가 이제 언젠가 해체 시간 이후, 흔적, 가능하게 된 결과를 변경을 해체하는 시간 을 측정되므로주의하시기 바랍니다 흔적을 측정 할 수 있습니다.

그리고 마지막으로 민간 가비지 수집 더블 네이트는 목표를 한 번만 호출해도 작동합니다.

bye