内存泄漏Sicstus Prolog

内存泄漏Sicstus Prolog,prolog,clpfd,sicstus-prolog,Prolog,Clpfd,Sicstus Prolog,这个问题是这个问题的后续问题 我正在Sicstus prolog中运行大量测试: runtest:- t1, t2, t3, . . t100. 每个测试都是独立的,并将其结果打印到屏幕上。测试之间没有关联,因此每个测试之间不需要存储/保存数据 我的问题是,Sicstus累积内存,最后遇到一个异常:“资源错误:内存不足” 我试着这样组织我的考试: runtest:- once( t1 ), once( t2 ), . . once( t100 ). 但我还是遇

这个问题是这个问题的后续问题

我正在Sicstus prolog中运行大量测试:

runtest:-
 t1,
 t2,
 t3,
 .
 .
 t100.
每个测试都是独立的,并将其结果打印到屏幕上。测试之间没有关联,因此每个测试之间不需要存储/保存数据

我的问题是,Sicstus累积内存,最后遇到一个异常:“资源错误:内存不足”

我试着这样组织我的考试:

runtest:-
  once( t1 ),
  once( t2 ),
  .
  .
  once( t100 ).
但我还是遇到了这个问题

是否有其他方法告诉Prolog在每次调用测试之间释放所有分配的内存?

尝试使用(现代):应该回收任何Prolog上的内存


不,没有办法告诉Prolog释放所有分配的内存

如果测试谓词不接受任何参数,并且将它们包装在once/1中没有帮助,那么故障驱动循环也不应该有帮助

一种可能是您的测试以某种方式添加了持久性数据,例如断言子句

尝试添加

垃圾收集、统计

在(一些)测试之间。这会让你了解哪些内存区域正在增长


从您前面的问题来看,可能是您的一个测试本身内存不足,也就是说,该问题与运行多个测试无关。

谓词once/1只删除选择点,但保留完整的轨迹。轨迹通常通过变量统一或 甚至通过约束解算器的约束

因此,您的测试链收集了大量数据。有一个序言民间传说 这对你有帮助。使用双重否定可以释放资源,这种构造 因此通常被称为垃圾收集

只需将代码重写为:

runtest:-
   \+ \+ t1,
   \+ \+ t2,
   \+ \+ t3,
   .
   .
   \+ \+ t100.
但请注意,您的测试现在也将测量时间 从某个时候开始,可能会改变旧的结果 拆除痕迹的时间是可以测量的

最后但并非最不重要的一点,当然是民间传说中的垃圾收集 双重否定只有在可以调用目标一次时才起作用


Bye

undo
可能是
once/1
无法回收空间的另一个原因。从术语上将此样式与常见的故障驱动循环区分开来会有很大帮助
findall/3
setof/3
内部有故障驱动的循环。不需要
one(T)
,因为
T
就足够了。
runtest:-
   \+ \+ t1,
   \+ \+ t2,
   \+ \+ t3,
   .
   .
   \+ \+ t100.