I''ve been doing a lot of testing witn RMagick lately, in view of
reports
that it leaks memory. I''m happy to report that RMagick doesn''t
seem to
leak at all, when used as directed -- that is, when you remember to set
the image variable to nil and call GC.start manually after you''re done
with an image.
BUT -- one ImageMagick format seems to be leaky! I was using the native
"MPC" format to store an intermediate image for processing, since
(according to the ImageMagick docs) it maps directly into memory and
should be very quick-loading. I kept seeing big increases in
virtual-memory allocation every time I used that image. The problem went
away when I changed the format of the intermediate file to anything else
(PNG, JPG).
Here''s the quickie script I sent to Timothy Hunter demonstrating the
problem. I''ve only tested it on a Mac (OS 10.4.6), so it might be
OS-specific. You might have to change the ps command -- what you''re
interested in is virtual memory allocation.
--Al Evans
-----
#!/usr/bin/env ruby
require ''RMagick''
include Magick
# name of original photo without extension
def photo_basename(name)
name.gsub(/\.\w+$/i, '''')
end
def make_image_cache(pic_file_name)
img = Image.read(pic_file_name).first
img.strip!.change_geometry("1024x1024") { |cols, rows, img|
img.resize!(cols, rows)
}
img.write("#{photo_basename(pic_file_name)}.MPC")
img = nil
GC.start
end
def make_image_workfile(pic_file_name)
img = Image.read("#{photo_basename(pic_file_name)}.MPC").first
img.strip!.change_geometry("640x512") { |cols, rows, img|
img.resize!(cols, rows)
}
img.write("#{photo_basename(pic_file_name)}_work.JPG") {
self.quality
= 50 }
img = nil
GC.start
end
while true
make_image_cache(ARGV[0])
make_image_workfile(ARGV[0])
puts `ps -l | grep ruby`
sleep(10)
end
--
Posted via http://www.ruby-forum.com/.