2013-04-04 106 views
3

我想找到一種方法來剖析我在prolog中編寫的謂詞(巨大的)的內存使用情況。我目前正在運行它swiyap,我可以從這些進程看到內存消耗,一大塊內存得到分配。Prolog內存問題

的問題是,當謂語終止它不會收集解除分配/釋放/垃圾(我不得不停止解釋看回)加的內存量只保留增長謂詞運行時(無論如何,因爲尾遞歸優化應該可以緩解這個問題,我想,在每次迭代中)。

有沒有一種方法來發現增加使用的內存和檢查是否有效地調用尾遞歸優化的子調度/調用?

任何其他建議如何優化問題將非常感激。如果這些是必要的,我會給出更多關於謂詞的細節。

回答

2

在SWI-Prolog的,一個簡單的方法,看看你的遞歸謂詞實際上是越來越尾優化使用prolog_current_framelook here):

foo :- 
    prolog_current_frame(F), format('~d~n',[F]), 
    do_something, 
    foo. 

如果執行尾優化,它會返回相同的每次用遞歸調用輸入謂詞時都是整數。我遇到了一個問題,我不知道我正在使用的謂詞是創建選擇點並防止尾部優化。

如果沒有尾巴的優化是實際的問題,那麼其他的東西你可以做的僅僅是把切遞歸調用之前:

foo :- 
    do_something, 
    !, foo. 

這將消除由do_something創建的任何選擇點。如果你的記憶力仍在增長,那麼問題可能在其他地方。你的謂詞是否創建了一個大型數據結構?或者使用很多中間列表?

+0

感謝您發現最後一次通話優化的提示。檢查非優化代碼的簡單和手動方法是在每個循環中調用prolog_current_frame/1。我看到這個謂詞也被yap識別,但它的值有時會發生變化(它與添加的剪輯不同,因此我認爲它不可靠)(我現在正在運行它來檢查內存消耗量它會需要1小時:)) – rano 2013-04-04 14:41:33

+0

基本上我正在做一些ILP工作,從一個大文件加載~7000個例子(每個500個字面小節子句)並對我當前最好的假設進行概括/細化,以解釋它們。我大量使用關聯列表並在每次迭代中創建/處理長列表。 – rano 2013-04-04 14:46:11

+1

@rano這確實是我的意思,每個週期調用'prolog_current_frame(Frame)',_Frame_不應該改變是執行尾部優化。我不知道這是否適用於YAP。 – 2013-04-04 15:04:31