我正在使用Ruby从多个源图像生成动画GIF文件。我需要最大化吞吐量/最小化创建每个GIF所花费的时间。我更喜欢将源图像保存在内存中(可能是Memcached),而不是每次需要时都从光盘中读取它们。我一直在反引号中使用convert
直接从Ruby执行imagemagick命令,例如。
`convert -delay #{delay} -page #{w}x#{h}+0+0 src01.gif... etc`
我稍微偏爱RMagick,因为我发现了更多示例,我可以直接引用ImageMagick文档。传递给convert
命令的图像似乎需要是光盘上图像的路径。此外,似乎转换命令的输出是一个文件路径,因此生成的图像将由ImageMagick写入光盘,我需要使用Ruby将其从光盘读回来访问生成的图像数据。看起来我每次都让ImageMagick从光盘读取源图像,并且每次都将生成的GIF写入光盘。我认为这可能是一个瓶颈而且没有必要,因为我不需要保留生成的图像,我只需要暂时访问Ruby中的图像数据。
我注意到RMagick方法可以将Magick::Image
s作为参数而不是文件路径。在这种情况下,我可以将源图像保留在内存中。另外RMagick将生成的图像作为数据返回给Ruby,这是我需要的,我不需要将它写入光盘。
我正在考虑使用RMagick而不是
`convert...`
减少光盘活动。
问题1:这有意义吗?由于RMagick可能包含了ImageMagick,因此RMagick实际上是在读取和写入光盘下的光盘,还是有一些方法可以在没有光盘活动的情况下使用ImageMagick?
问题2:有没有办法在没有光盘活动的情况下将图像数据输入和输出ImageMagick的转换命令?
希望这是有道理的。如果我不清楚,只是试图绕过这个并道歉。
答案 0 :(得分:1)
这有意义吗?
不是真的。我们可以争论开放的fd,以及shell环境相对于直接API的成本,但转换实用程序和实用程序之间不存在任何磁盘I / O好处。 RMagick。
有没有办法在没有光盘活动的情况下将图像数据输入和输出ImageMagick的转换命令?
ImageMagick附带stream
实用程序。使用文档不多,但可以利用它将图像数据提取到可以通过memcached分发的blob。
还有mpr:
协议来处理基于标签的内存访问,但这可能不是您要查找的分布式解决方案。在处理完成时删除数据。
就个人而言,Marks对RAMdisk的评论将是我推荐的。一个简单的内存/ tmpfs挂载很容易在系统上进行设置,然后只需要更新policy.xml
配置就可以将所述挂载用作临时目录。