Pixbuf - memory leak?

Hello,

I am using gtk2 for image processing and the memory usage consistently
grows (memory never gets reclaimed).

The code is along the lines:

pixell coordinates to memory address of the first byte)

def p2i(px, py, channels, rowstride)
px * channels + py * rowstride
end

def process_image(pixbuf, output_dir)
pixbuf.width.times do |x|
pixbuf.height.times do |y|
sample = pixbuf.pixels[p2i(x, y, pixbuf.n_channels,
pixbuf.rowstride), pixbuf.n_channels]
# do something with the sample here
end
end
end

def process_images(input_dir, output_dir)
image_paths = Dir.glob(input_dir + “/*.png”).sort

for ip in image_paths
    pixbuf = Gdk::Pixbuf.new(ip)

process_image(pixbuf, output_dir)
end

end

Am i supposed to call garbage collection by hand or the gtk2 is not
supposed to be used like this?

Vlad

Am Samstag, den 17.05.2008, 15:31 +0200 schrieb Vladimir K.:

Hello,

I am using gtk2 for image processing and the memory usage consistently
grows (memory never gets reclaimed).

[snip]

Am i supposed to call garbage collection by hand

yes, for now you have to start the GC on your own if you big amounts of
data very fast.

Cheers, detlef

Hello,

I am using gtk2 for image processing and the memory usage consistently
grows (memory never gets reclaimed).

[snip]

Am i supposed to call garbage collection by hand

yes, for now you have to start the GC on your own if you big amounts of
data very fast.

Thanks for the pointer.

Well, to process one image takes minutes…

I have put the GC.start at the relevant place (in the cycle after
process_imate() call) and will see what happens…

Vlad

Am Samstag, den 17.05.2008, 19:14 +0200 schrieb Detlef R.:

Another speedup you’ll get, if you precalculate some variables like
this:

pixels = pixbuf.pixels
w = pixbuf.width
h = pixbuf.height

h.times do |y|
rs = y * pixbuf.rowstride
ch = pixbuf.n_channels
w.times do |x|
sample = pixels[x * ch + rs]
end
end

Cheers, detlef

Detlef R. wrote:

you create for every single pixle an array with all pixels from the
pixbuf. That must be horrible slow. Change your method as followed:

(blushing for being stupid publicly :wink:

Thanks to all who replied,

I have re-done the method (create pixels array once per picture) - it
works faster and also it looks that the memory usage is OK.

Vlad

Am Samstag, den 17.05.2008, 18:33 +0200 schrieb Vladimir K.:

data very fast.

Thanks for the pointer.

Well, to process one image takes minutes…

Sorry, i’ve overlooked something in your example. Here

sample = pixbuf.pixels[p2i(x, y, pixbuf.n_channels,
pixbuf.rowstride), pixbuf.n_channels]

you create for every single pixle an array with all pixels from the
pixbuf. That must be horrible slow. Change your method as followed:

def process_image(pixbuf, output_dir)
pixels = pixbuf.pixels
pixbuf.width.times do |x|
pixbuf.height.times do |y|
sample = pixels[p2i(x, y, pixbuf.n_channels,
pixbuf.rowstride), pixbuf.n_channels]
# do something with the sample here
end
end
end

Cheers, detlef