如何处理非 Image 对象上的 RMagick 泄漏?
所以我知道 RMagick 会在 Image
对象中到处泄漏,并且 #destroy!
会释放该内存。
然而,我正在编写一个迭代图像所有像素的脚本,而且我必须处理这样一个事实:即使是 RMagick 的其他对象,包括 Pixel
,也会到处泄漏。
image = Magick::Image::read('/path/to/image.png')[0]
5.times do
100000.times do
image.pixel_color(0,0)
end
print "Check memory, then press enter";gets
end
运行并观察它泄漏得到的到处都是。只需读取像素即可。
如何在不疯狂泄漏的情况下迭代这些像素? 我对 RMagick 解决方案、非 RMagick 解决方案感兴趣,甚至对非 Ruby 解决方案(如果需要)感兴趣(但我真的不想) 。
如果已经有一个用于此特定任务的工具,但我无法找到搜索查询,这就是我正在做的事情:我有两个图像,它们是通过在纯色背景上叠加 RGBA 图像而生成的(在本例中为,一黑一白)。该脚本执行一些简单的数学运算来检索原始图像、Alpha 透明度等。我找不到命令行工具来完成这项确切的工作,但是,话又说回来,用一句话来表达并不容易。
So I know that RMagick leaks all over the place with Image
objects, and that #destroy!
frees up that memory.
However, I'm writing a script that iterates through all the pixels of an image, and I have to deal with the fact that even RMagick's other objects, including Pixel
, leak all over.
image = Magick::Image::read('/path/to/image.png')[0]
5.times do
100000.times do
image.pixel_color(0,0)
end
print "Check memory, then press enter";gets
end
Run and watch it leak all over the place. Just by reading pixels.
How can I iterate over these pixels without leaking like crazy? I'm interested in RMagick solutions, non-RMagick solutions, and even non-Ruby solutions if need be (but I'd really rather not).
In case there's already a tool for this specific task that I can't find a search query for, here's what I'm doing: I have two images that were generated by overlaying an RGBA image on a solid-color background (in this case, one black and one white). This script does some simple math to retrieve the original image, alpha transparency and all. I couldn't find a command-line tool to do this exact job, but, then again, it's not exactly easy to put into a short phrase.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
目前,我选择使用 ChunkyPNG,一个纯 Ruby 库,以避免 RMagick 的泄漏。我可能会在不久的将来将 C 扩展 OilyPNG 添加到该设置中。
我暂时接受这个答案,因为它解决了我的特殊问题。但是,如果有人找到真正解决非图像上 RMagick 内存泄漏核心问题的解决方案,请无论如何发布:D 谢谢!
For the time being, I've opted to use ChunkyPNG, a pure Ruby library, to avoid RMagick's leakiness. I may add the C extension OilyPNG to that setup in the near future.
I'm accepting this answer for the time being, since it solves my particular problem. However, if anyone finds a solution that actually addresses the core issue of RMagick's memory leaks on non-images, please post it anyway :D Thanks!