Subject: Re: bug#61763: 30.0.50; Image Cache Size growth

From: Eli Zaretskii <[email-masked]>
Date: Sat, 25 Feb 2023 09:09:35 +0200

> From: Manuel Giraud <[email-masked]>
> Cc: [email-masked]
> Date: Fri, 24 Feb 2023 22:32:49 +0100
> 
> Eli Zaretskii <[email-masked]> writes:
> 
> [...]
> 
> > JPEG compression is very good, it routinely compresses images with
> > ratios of 10:1 to 20:1.  If I use djpeg to convert the 2 MiB images I
> > used into BMP, I get 36 MiB BMP files -- that's a 1:18 expansion
> > ratio.  And Emacs converts each image to a pixmap for display, which
> > is basically similar to what I did.  Multiply that by 20 or 30, and
> > you get the numbers you see, I think.
> 
> Yes, one of the images I'm using is 3264 by 2448 pixels times 3 octets
> (RGB, I guess) and we get about 23MiB... so those numbers seems ok.
> 
> > The solution is to enlarge the VM for your machine (by enlarging swap,
> > for example).  If you don't keep those images displayed in windows,
> > lowering image-cache-eviction-delay might also help.
> 
> In image.c line 2079, there is already a mecanism to automatically lower
> this delay if the cache has grown large (so I think we're covered here).

But that happens when the number of cached images is above 40, and you
are saying you have problems with memory before that.

Also, the limit of 40 images is _per_frame_, so if you show images in
separate frames, the automatic lowering will happen later, if at all.

> But OTOH, at line 3010, we can see that this cache will grow no matter
> what.

That's not what happens at line 3010.  There, we enlarge the number of
available slots in the cache, but not the number of cached images.
The memory taken by the cache itself is very small compared to the
memory used by the images.

> Maybe we should have parameter (maybe a custom) that limit this
> growth up to a certain point and then start uncaching older images.
> WDYT?

We cannot uncache an image that is being displayed in some window.
Doing so would immediately cause a crash on the next redisplay cycle.
So lowering the eviction delay is the mechanism you should use,
assuming it helps in your use case.  Did you try that, and if you did,
did it help?  For how much time do you display each image before you
discard its buffer or delete its window?