Prolog记忆问题

时间:2013-04-04 13:00:42

标签: prolog profiling swi-prolog yap

我想找到一种方法来分析一个谓词(一个巨大的)的内存使用情况,我用prolog写的。我目前正在使用swiyap运行它,我可以从这些进程中看到内存消耗大量内存被分配。

问题是,当谓词终止时,它不会被解除分配/释放/垃圾收集(我必须暂停解释器才能看到它)加上内存量只能保持增长谓词正在运行(因为尾部递归优化应该缓解问题,我猜,在每次迭代时都不会)。

有没有办法发现增加所用内存的subpredicate / call并检查尾递归优化是否被有效调用?

非常感谢有关如何优化问题的任何其他建议。如果有必要,我将提供有关谓词正在做什么的更多细节。

1 个答案:

答案 0 :(得分: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创建的所有选择点。如果您的内存使用仍在增长,那么问题可能出在其他地方。您的谓词是否创建了大型数据结构?还是使用了很多中间清单?