Hacker News new | ask | show | jobs
by pilif 5636 days ago
IMHO, there's a huge difference between calling a C library directly and shelling out to an external process.

mini_magick uses Subexec which in turn causes a fork and exec and might, depending on how ruby's backtick operator work, also start a shell which in turn does another exec for the specific ImageMagick binary.

The process startup time alone is a significant overhead and so is the additional memory usage.

In the old days, when I was maintaining a mail server for a free web mail service, I remember the lengths I went through to prevent my MTA from forking for mail delivery due to the huge cost of launching another process.

3 comments

I use RMagick for a rails based image repository, and I have to shell out to run the RMagick code because of memory problems. When I used to keep it all in the rails process, those guys would get up to the 2-3G range over the course of a couple of days.

I'll have to check out minimagick, it might be cleaner than what I am doing now.

Have you tried manually calling GC.start with rmagick
In this particular application, I have to inspect PDF and TIFF files that might have hundreds of pages or frames. These files can be over 100MB easily. Running those through RMagick makes the process blow up to enormous sizes. Even if the memory gets garbage collected, Solaris doesn't really release it.

Its just safer to keep it in a different process.

Well, the mini_magick documentation mentions that the spawn of a subprocess is the main point of that library:

"Using MiniMagick the ruby processes memory remains small (it spawns ImageMagick’s command line program mogrify which takes up some memory as well, but is much smaller compared to RMagick)"

Forking isn't always bad. See http://tomayko.com/writings/unicorn-is-unix

mini_magic has the advantage of not leaking memory all over the place.