我使用Cairo.PNG.create来读取OCaml中的图像。 我得到了
Fatal error: exception Out_of_memory
当我尝试阅读一些图像时它们是5KB,但有大小为5KB的图像我可以阅读。我可以阅读更大的图像(例如45KB),所以我不认为错误的原因是图像的大小。但是,我找不到除了尺寸之外我无法读取的图像的共同点。 我何时在OCaml中使用Cairo.PNG.create获取错误?我想要提示删除错误。
答案 0 :(得分:1)
要检查的其他内容是您正在阅读的图像是否格式正确。也许这些图像将自己描述为巨大的。我相信我已经看到了一些流行的PNG格式,其大小看起来非常大。
答案 1 :(得分:0)
这种错误通常是内存损坏的标志。你应该看看所有对Marshal
模块的调用,无论是直接调用还是间接调用(如input_value
)。他们通常是邪恶的原因。否则,可能的候选者是C
- 绑定中的错误。这种错误很难找到和调试。
P.S。并且,为了确保这确实是内存损坏,您应该查看dmesg
输出。如果它不是内存损坏,那么必须有来自OOM杀手的注释,例如"杀死所有孩子等等#34;。但是我很确定你不会看到这样的事情,因为用OOM杀死的应用程序通常都会用最后一句话结束:" Killed"。
答案 2 :(得分:0)
Cairo.PNG.create
是C函数thin wrapper周围的cairo_image_surface_create_from_png
。当C函数返回raises Out_of_memory
时,它CAIRO_STATUS_NO_MEMORY
。由于这是在分配任何内存之前完成的,我不认为这是包装器中的错误。你能在图像上报告命令file
的结果吗?