运行 32 位版本的 ImageMagick 的内存使用量是否会是 64 位版本的一半?

运行 32 位版本的 ImageMagick 的内存使用量是否会是 64 位版本的一半?

我正在使用 ImageMagick 处理大型 TIFF 图像,由于处理发生在有限的资源环境中(阿里巴巴上的函数计算,与 AWS Lambda 几乎相同),因此遇到了内存问题。有时该进程会耗尽内存,有时会耗尽临时磁盘空间。

我相信我目前正在使用 ImageMagick 二进制文件的 64 位版本convert。如果我要在 32 位下自定义编译 ImageMagick 二进制文件,我的图像处理可能会使用一半的内存吗?

我相信答案是否定的,但我只是想仔细检查一下。我的猜测是,convert加载到内存中的二进制文件大小仅为一半,实际图像处理将使用与使用 64 位版本的convert.

答案1

64 位程序与 32 位程序通常只影响程序可以直接寻址的内存量。除了程序内变量的大小之外,程序本身可能不会占用更多的内存空间。 IE:32 位二进制文​​件上的 C 程序中的 int 最大值约为 20 亿; 64 位二进制文​​件上的 int 的最大值为 9,223,372,036,854,780,000。现在,64 位程序可以在更大的内存空间中读入或处理数据,但程序本身不会使用更多的内存。

简短回答:如果您正在处理大型数据文件,32 位二进制文​​件将无济于事。

答案2

嗯,64 位与 32 位确实在某种程度上改变了运行时内存的使用,因为它改变了指针。在 上amd64, an int(默认整数类型)仍然是 32 位,因此不会改变。但是使用大量指针数据结构(如树或链表)的程序;或者通过指针访问所有变量的高级语言解释器可能会受到影响。使用 64 位指针指向(比如)128 位结构将产生 50% 的开销,而使用 32 位指针则只有 25%。

正是由于指针大小的原因,实际上存在一个在 64 位系统上使用 32 位应用程序的 ABI 规范amd64,但我认为它并没有受到太多关注。看x32 ABI在维基百科上。

由于 ImageMagick 处理图像数据(主要是数字数组),因此它可能不会受到太大影响。

相关内容