[Image-SIG] Enormous memory usage using PIL

Klamer Schutte Schutte@fel.tno.nl
Fri, 21 Dec 2001 11:29:40 +0100


Hi,

On my RedHat 7.2 Linux / Python 1.5.2 / Imaging 1.1.2 system I tend to use
a lot of memory with PIL Image's, and ImageTk.Photoimage's in a tkinter Text
window. Having in total 3x40x1000 = 120000 pixels stored my process grows to
200 Mb python size, with 80 Mb swapped in, and also a resident X (24 bits) 
server size of 80 Mb resident.
I would expect something like 120000*24bits == less then 0.5 Mb usage due to
this
data. 

Anyone has an idea what is going on, and how to correct it?

Klamer

Relevant code fragments:

NrGrids = 40 # 40 grid cells per row

class ConfView:
    # ConfView provides a view of confidence data

    def __init__(self, master, sensor):

        self.sensor = sensor
        self.master = master
        self.frame = Frame(master)
        self.frame.pack(side=LEFT)
        Label(self.frame,text=sensor.name).pack(side=TOP)
        self.text = Text(self.frame, width=20)
        self.text.pack()
        im = Image.open('tno-logo.bmp')
        self.imtk = ImageTk.PhotoImage(im)
        self.text.image_create(END, image=self.imtk)
        # Label(self.frame,image=self.imtk,bd=0).pack(side=TOP)
        self.text.insert( END, 'begin\n' )
        self.cur = 0
        self.master.after(delay_ms, self.poll)
        self.conf_data_images = { }

    def get_data(self, low, hi, data):

        low = int(low)
        hi = int(hi)
        if (low != self.cur):
            app.add_text('ConfView::get_data: low ' + `low` + ' != cur ' +
                         `cur` + '\n', LOG_ERROR)
        im = Image.new("L", (NrGrids, hi-low))
        cnt = 0
        palette = [ ]
        while cnt < 256:
            palette.append(cnt)
            cnt = cnt + 1
        while cnt < 768:
            palette.append(0)
            cnt = cnt + 1
        # print 'image data:', data
        im.fromstring(data)
        im.putpalette(palette)
        # im.show()
        try:
            imtk = ImageTk.PhotoImage(im)
            self.conf_data_images[(low,hi)] = imtk  
            self.text.image_create(END, image=imtk)
            self.text.insert( END, '\n' )
            self.poll()
        except TclError, err:
            app.add_text('ConfView for ' + self.sensor.name + ' closed\n',
                         LOG_STRANGE)

-- 
Klamer Schutte, E-mail: Schutte@fel.tno.nl
Electro-Optical Systems, TNO Physics and Electronics Laboratory
Tel: +31-70-3740469 -- Fax: +31-70-3740654 -- Mobile: +31-6-51316671