On 8/29/05, Joe Van Dyk <joevandyk / gmail.com> wrote:
> On 8/29/05, Timothy Hunter <cyclists / nc.rr.com> wrote:
> > Joe Van Dyk wrote:
> > > On 8/28/05, Timothy Hunter <cyclists / nc.rr.com> wrote:
> > >
> > >>No matter which approach you take let me know how it goes so I'll be
> > >>able to make recommendations to other RMagick users who are working with
> > >>very large images. Thanks!
> > >
> > >
> > > Yes, my Ruby program was taking up about 500 MB of memory (for a
> > > 8700x6000 pixel image).  Memory's not a problem though, all of our
> > > machines have more than 2 gigabytes.
> > >
> >
> > Okay, first recommendation: have a honkin' great big machine :-)
> 
> (in case people forgot, the color values in @tad_data are from 0-255,
> so conversion is needed if ImageMagick is using 16 bit color pixels)
> 
> The inner code loop looked something like this:
> 
>     (height - 1).downto(0) do |n|
>       # Code here that displayed percent-done status to user
>       width.times do |e|
>         # Lookup approach with 16 bit pixel ImageMagick
>         #rgb = @tad_data.read(8).unpack(TAD_FORMAT).collect! { |c|
> lookup_table[c] }
> 
>         # Bitshifting approach with 16 bit pixel ImageMagick
>         #rgb = @tad_data.read(8).unpack(TAD_FORMAT).collect! { |c| (c
> << 8) | c }
> 
>         # 8 bit ImageMagick, no conversion necessary
>         rgb = @tad_data.read(8).unpack(TAD_FORMAT)
> 
>         pixel = Magick::Pixel.new(*rgb)
>         @image.pixel_color(e, n, pixel)
>       end
>     end
> 
> Doing a 10000x10 pixel image (only 10 pixels high for unit testing
> purposes), I could process:
> 
> 13k pixels/second with the bitshifting approach (and 16 bit IM)
> 13k pixels/second with the array lookup approach (and 16 bit IM)
> 21k pixels/second with 256 bit IM.
> 
> I also found that building up an array of colors for one row and then
> doing a @image.import_pixels had no speed improvements and the code
> was uglier.

Hm... I don't think that those pixels/second numbers are correct.  I
was doing the timings inside a Benchmark.measure { ... } block and
perhaps that makes things slower?

I was able to process a 8700x6000 pixel image when using 'time ./script.rb'
440.005u 9.917s 8:27.20 88.7%       0+0k 0+0io 52012pf+0w

So, around 7 minutes for 5 million pixels.. that's around 118000
pixels per second.  Hm.  Oh well, it's fast enough for me.  This
operation isn't done all that often.   Although, a while ago I did
something like this in C with the GD library, and it took around 10-20
seconds to process a similar sized image.