Ocaml"Out of memory"异常; 详细模式说"结构比较中的堆栈溢出"

P S*_*ved 4 crash ocaml out-of-memory

需要修复来自外来源的非常大的ocaml程序.其中一个问题是该程序在看似无辜的线路上崩溃:

Hashtbl.mem loc_to_no loc
Run Code Online (Sandbox Code Playgroud)

"内存不足"例外.问题是那里肯定有足够的内存,这条线对于其他输入执行得很好,甚至在处理问题时更早.

运行它后OCAMLRUNPARAM="v=63",我看到在崩溃之前打印的一行:

结构比较中的堆栈溢出

涉及的结构定义如下. loc是类型的location.

type ('a, 'b, 'c) automaton = {
  aut_id : int ;               
  mutable start_location : (('a, 'b, 'c) location) option ;
  mutable end_location   : (('a, 'b, 'c) location) option ;
  mutable aut_attributes : 'a ;                            
}
and ('a, 'b, 'c) location = {                              
  loc_id : int ;
  mutable succs : ('c * ('a, 'b, 'c) location) list ;
  mutable preds : ('c * ('a, 'b, 'c) location) list ;
  automaton : ('a, 'b, 'c) automaton ;
  mutable loc_attributes : 'b ;
}
Run Code Online (Sandbox Code Playgroud)

应该怎么做才能使代码执行?

new*_*cct 6

好吧,哈希表查找使用" ="(结构相等)来确定密钥是否与您要查找的密钥相同.结构平等需要深入检查所有子结构和东西.您有一个复杂的递归数据结构.也许在某个时刻结构中存在一个循环,这会导致它无限循环.在任何情况下,考虑一下你希望哈希表如何判断一个键是否与你的相同,然后你需要使用那种相等而不是默认的结构相等; 使用Hashtbl.Make仿函数来定义具有自定义相等和/或散列函数的散列表模块.