2013-04-04 108 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