2014-02-12 66 views
6

此問題是此question的後續操作。內存泄漏Sicstus Prolog

我運行了大量的測試,在Sicstus序言:

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

每個測試是獨立的,並打印其結果到屏幕上。測試之間沒有關係,所以在每次測試之間不需要存儲/保存數據。

我的問題是Sicstus積累內存終於命中一個例外:「資源錯誤:內存不足」

我曾試圖組織我的測試是這樣的:

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

但我仍然進入問題。

是否有任何其他方式告訴Prolog在每次調用測試之間釋放所有分配的內存?使用(現代)failure driven loop

回答

3

嘗試:應該填內存任何的Prolog

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

從術語上將這種風格與常見的故障驅動循環分開將有很大的幫助。 'findall/3','setof/3'裏面有失敗驅動循環。 – false

+3

因爲「T」足夠,所以不需要「一次(T)」。 – false

6

沒有,有沒有辦法告訴Prolog的釋放所有分配的內存。

如果測試謂詞沒有參數,並且將它們封裝在一次/ 1中並沒有幫助,那麼失敗驅動循環也不應該有所幫助。

一種可能性是您的測試以某種方式添加持久性數據,例如,斷言條款。

嘗試增加

garbage_collect, statistics

(一些)測試之間

。這應該讓你瞭解哪些內存區域正在增長。

從您以前的問題來看,可能是您的某個測試本身運行內存不足,即該問題與運行多個測試無關。

+3

'撤銷'可能是'once/1'無法回收空間的另一個原因。 – false

2

謂詞一次/ 1只切掉選擇點,但留下完整的蹤跡。通常通過變量統一或 擴展該線索,即使通過約束求解器的約束。

因此,您的測試鏈會收集大量數據。有一個Prolog民間傳說 這將幫助你。使用雙重否定釋放資源,因此這個構造 通常被稱爲垃圾收集。

只需重寫你的代碼:

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

但請注意,您的測試現在也可以測量時間 推倒線索,可能改變舊的結果,因爲有時 推倒時間足跡可以衡量。

最後但並非最不重要的,當然民間傳說垃圾收集 雙重否定只適用於可以調用一次目標。

再見