使用 rmagick 或 imagemagick 最小化光盘 activity

Minimize disc activity with rmagick or imagemagick

我正在使用 Ruby 从多个源图像生成动画 GIF 文件。我需要最大化吞吐量/最小化创建每个 GIF 所花费的时间。我宁愿将源图像保存在内存中(可能是 Memcached),而不是每次需要时都从光盘中读取它们。我一直在反引号中使用 convert 来直接从 Ruby 执行 imagemagick 命令,例如

`convert -delay #{delay} -page #{w}x#{h}+0+0 src01.gif... etc`

与 RMagick 相比,我更喜欢这个,因为我找到了更多示例,我可以直接参考 ImageMagick 文档。似乎传递给 convert 命令的图像需要是磁盘上图像的路径。此外,convert 命令的输出似乎是一个文件路径,因此生成的图像将由 ImageMagick 写入光盘,我需要使用 Ruby 将其从光盘读回以访问生成的图像数据。好像我让 ImageMagick 每次都从光盘读取源图像,每次都将生成的 GIF 写入光盘。我认为这可能是一个瓶颈并且是不必要的,因为我不需要保留生成的图像我只需要暂时访问 Ruby 中的图像数据。

我注意到 RMagick 方法可以将 Magick::Images 作为参数而不是文件路径。在这种情况下,我可以将源图像保存在内存中。另外 RMagick returns 生成的图像作为数据 Ruby 这是我需要的,我不需要它写入光盘。

我正在考虑使用 RMagick 而不是

`convert...`

减少光盘activity。

所以问题 1:这有意义吗?由于 RMagick 大概包装了 ImageMagick,RMagick 实际上是在后台读取和写入光盘还是它有某种方式在没有光盘的情况下利用 ImageMagick activity?

以及问题 2:有没有什么方法可以在没有光盘的情况下从 ImageMagick 的转换命令中获取图像数据 activity?

希望这是有道理的。只是想解决这个问题,如果我不清楚,请道歉。

Does this make sense though?

不是真的。我们可以争论开放的 fd 和 shell 环境的成本比直接 API,但是转换实用程序和 RMagick 之间不会有任何磁盘 I/O 的好处。

Is there any way to get image data in and out of ImageMagick's convert command without disc activity?

ImageMagick 附带 stream 实用程序。没有太多使用文档,但可以利用它来将图像数据提取到可以通过 memcached 分发的 blob。

还有 mpr: 协议来处理基于标签的内存访问,但这可能不是您正在寻找的分布式解决方案。 Plus 数据在流程完成时被删除。

就我个人而言,我会推荐 Marks 关于 RAMdisk 的评论。一个简单的 memory/tmpfs 挂载很容易在系统上设置,然后只需更新 policy.xml 配置即可将所述挂载用作临时目录。