【问题标题】:Minimize disc activity with rmagick or imagemagick使用 rmagick 或 imagemagick 最小化磁盘活动
【发布时间】:2016-05-25 15:39:05
【问题描述】:

我正在使用 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 将生成的图像作为数据返回给 Ruby,这是我需要的,我不需要将其写入光盘。

我正在考虑使用 RMagick 而不是

`convert...`

减少磁盘活动。

所以问题 1:这有意义吗?既然 RMagick 可能包装了 ImageMagick,那么 RMagick 是否真的在后台读取和写入磁盘,或者它是否有某种方式在没有磁盘活动的情况下使用 ImageMagick?

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

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

【问题讨论】:

  • 您可以考虑制作一个小型 RAMdisk 作为一种选择。
  • 当然,您也可以在 Ruby 中累积/生成图像并从序列中创建动画 GIF...不确定 Ruby 语法但在 PHP 中,您可以为每个帧直到你有完整的序列,然后你做setImageDispose()writeImages("animated.gif",true)

标签: ruby imagemagick rmagick


【解决方案1】:

这有意义吗?

不是真的。我们可以争论 open fd 和 shell 环境的成本优于直接 API,但 convert 实用程序和 RMagick 之间不会有任何磁盘 I/O 优势。

有没有什么方法可以在没有磁盘活动的情况下从 ImageMagick 的转换命令中获取图像数据?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    相关资源
    最近更新 更多