Getting [Fatal error: exception Out_of_memory] using Cairo.PNG.create in OCaml
Getting [Fatal error: exception Out_of_memory] using Cairo.PNG.create in OCaml
我使用 Cairo.PNG.create 在 OCaml 中读取图像。
我得到
Fatal error: exception Out_of_memory
当我尝试阅读一些图片时。它们是 5KB,但是我可以读取大小为 5KB 的图像。我可以读取更大的图像(例如 45KB),所以我认为错误的原因不是图像的大小。但是,除了尺寸之外,我找不到与我无法阅读的图像的共同点。
什么时候在 OCaml 中使用 Cairo.PNG.create 会出现错误?我想要删除错误的提示。
这类错误通常是内存损坏的迹象。您应该查看对 Marshal
模块的所有调用,无论是直接调用还是间接调用(如 input_value
)。它们通常是邪恶的原因。否则,可能的候选者是 C
-bindings 中的错误。这种错误很难发现和调试。
P.S。而且,要确保这确实是内存损坏,您应该查看 dmesg
输出。如果不是内存损坏,那么一定有 OOM killer 的注释,比如 "killing all children, etc"。但我很确定你不会看到这样的东西,因为被 OOM 杀死的应用程序通常以最后一个词结束:"Killed".
还需要检查您正在阅读的图像是否格式正确。也许这些图像将自己描述为巨大的。我相信我见过一些流氓 PNG 格式,它们的尺寸看起来大得离谱。
Cairo.PNG.create
是一个 thin wrapper around the C function cairo_image_surface_create_from_png
. It raises Out_of_memory
when the C function returns CAIRO_STATUS_NO_MEMORY
。由于这是在分配任何内存之前完成的,因此我认为这不是包装器中的错误。你能在你的图像上报告命令 file
的结果吗?
我使用 Cairo.PNG.create 在 OCaml 中读取图像。 我得到
Fatal error: exception Out_of_memory
当我尝试阅读一些图片时。它们是 5KB,但是我可以读取大小为 5KB 的图像。我可以读取更大的图像(例如 45KB),所以我认为错误的原因不是图像的大小。但是,除了尺寸之外,我找不到与我无法阅读的图像的共同点。 什么时候在 OCaml 中使用 Cairo.PNG.create 会出现错误?我想要删除错误的提示。
这类错误通常是内存损坏的迹象。您应该查看对 Marshal
模块的所有调用,无论是直接调用还是间接调用(如 input_value
)。它们通常是邪恶的原因。否则,可能的候选者是 C
-bindings 中的错误。这种错误很难发现和调试。
P.S。而且,要确保这确实是内存损坏,您应该查看 dmesg
输出。如果不是内存损坏,那么一定有 OOM killer 的注释,比如 "killing all children, etc"。但我很确定你不会看到这样的东西,因为被 OOM 杀死的应用程序通常以最后一个词结束:"Killed".
还需要检查您正在阅读的图像是否格式正确。也许这些图像将自己描述为巨大的。我相信我见过一些流氓 PNG 格式,它们的尺寸看起来大得离谱。
Cairo.PNG.create
是一个 thin wrapper around the C function cairo_image_surface_create_from_png
. It raises Out_of_memory
when the C function returns CAIRO_STATUS_NO_MEMORY
。由于这是在分配任何内存之前完成的,因此我认为这不是包装器中的错误。你能在你的图像上报告命令 file
的结果吗?