Ocaml 程序执行一段时间后没有产生新的输出

Ocaml execution of program not producing new output after some time

我有 3 个 ocaml 模块,树的最后一个模块进行实际计算并使用其他 2 个中定义的函数。

该程序的基本思想是将一个港口作为初始状态,其中包含船只,并移动这些船只,直到我们达到胜利局面或无法再移动。 实际代码在这里并不是真正的问题。它可能不是很有效,但找到了解决方案......除非它没有。

虽然程序在复杂情况下需要几秒钟,但在某些情况下,当我增加一点复杂性时,找到解决方案需要很长时间。

当我这样执行程序时:

$ ocamlc -o test.exe port.ml moves.ml solver.ml
$ ./test.exe > file

生成的文件确实很大,但它的大小在一段时间后停止增长.. 在我看来,一段时间后 程序停止 运行 但没有终止,不会抛出 Whosebug 或内存不足错误。程序根本不会继续执行。 换句话说,命令

$ ./test.exe > file

仍在执行,但不再向文件添加新行。如果我登录到 shell 本身而不是文件,我会得到相同的结果:一段时间后不会继续添加新行。

这会是什么?

main函数(负责求解)采用深度优先搜索算法,包含大量的List操作,如List.fold, List.map, List.iter, List.partition, List.filter。我在想,也许这些函数在某些时刻处理大量复杂类型的列表时会出现问题,但同样,没有抛出错误,执行只是停止了。

这个我解释的很笼统,但是我真的不明白这里的问题。我不知道问题是否与我的 shell (Ubuntu subsystem on windows) 运行 out of memory 或 ocaml List functions being limited at some point 有关... 如果您有任何建议,欢迎评论

要调试此类情况,您应该使用操作系统和 OCaml 基础结构本身提供的诊断实用程序。

首先,您应该查看进程的状态。如果您是 运行 Unix 机器,则可以使用 tophtop 实用程序。否则,您可以使用任务管理器。

如果进程 运行 超出物理内存,它可能会被操作系统交换。那样的话,所有的内存操作都会变成硬盘的读写。因此,垃圾收集存储在硬盘驱动器中的堆将需要一些时间。如果是这种情况,那么您可以使用内存分析器来确定问题的症结所在。

如果进程一直 运行 而内存占用量没有变化,那么看起来您可能遇到了代码中的错误,即无限循环,或者您的某些算法有指数复杂性,正如康斯坦丁在评论中提到的那样。使用调试输出或跟踪来确定程序停止的位置。

最后,如果你的程序处于休眠状态,那么它可能是一个死锁。例如,如果您正在读取和写入同一个文件,这可能会导致竞争条件。通常,如果您的程序是多线程的或操作多个进程,则有很多可能引发竞争条件。