GNU bug report logs -
#28590
Weak tables in 2.2.2 grow indefinitely
Previous Next
Reported by: ludo <at> gnu.org (Ludovic Courtès)
Date: Mon, 25 Sep 2017 08:50:01 UTC
Severity: serious
Done: ludo <at> gnu.org (Ludovic Courtès)
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
[Message part 1 (text/plain, inline)]
Your bug report
#28590: Weak tables in 2.2.2 grow indefinitely
which was filed against the guile package, has been closed.
The explanation is attached below, along with your original report.
If you require more details, please reply to 28590 <at> debbugs.gnu.org.
--
28590: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=28590
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
ludo <at> gnu.org (Ludovic Courtès) skribis:
> Consider this program:
>
> (use-modules (ice-9 format))
>
> (define loops 3000000)
>
> (define table
> (make-weak-key-hash-table))
>
> (let loop ((i loops))
> (unless #f ;(zero? i)
> (when (zero? (modulo i 100000))
> (format #t "heap-size: ~,2h MiB table: ~s~%"
> (/ (assoc-ref (gc-stats) 'heap-size) (expt 2. 20))
> table))
>
> (hashq-set! table (cons 1 2) #t)
> (loop (1- i))))
>
> On 2.0.14, the heap size stays at around 24 MiB, and the table size is
> stable at 224,717 buckets (?).
>
> On 2.2.2, the heap grows indefinitely (though logarithmically). It’s
> not deterministic though: sometimes the heap size stabilizes in the
> 140–300 MiB range, and sometimes it keeps growing endlessly even though
> the table size reaches a maxium at 7,190,537 entries.
This is fixed with Andy’s rewrite of weak tables to bucket-and-chains as
in 2.0:
https://git.savannah.gnu.org/cgit/guile.git/commit/?h=stable-2.2&id=a053c0510c4a644f9453166b7b385cf30f6d3a21
https://git.savannah.gnu.org/cgit/guile.git/commit/?h=stable-2.2&id=d01addeb1feba830ddd703e27f89576864a063ff
https://git.savannah.gnu.org/cgit/guile.git/commit/?h=stable-2.2&id=dc8dda77e0c937abae42a76ea88c6e7995adbd9a
https://lists.gnu.org/archive/html/guile-devel/2017-10/msg00051.html
\o/
Ludo’.
[Message part 3 (message/rfc822, inline)]
Consider this program:
--8<---------------cut here---------------start------------->8---
(use-modules (ice-9 format))
(define loops 3000000)
(define table
(make-weak-key-hash-table))
(let loop ((i loops))
(unless #f ;(zero? i)
(when (zero? (modulo i 100000))
(format #t "heap-size: ~,2h MiB table: ~s~%"
(/ (assoc-ref (gc-stats) 'heap-size) (expt 2. 20))
table))
(hashq-set! table (cons 1 2) #t)
(loop (1- i))))
--8<---------------cut here---------------end--------------->8---
On 2.0.14, the heap size stays at around 24 MiB, and the table size is
stable at 224,717 buckets (?).
On 2.2.2, the heap grows indefinitely (though logarithmically). It’s
not deterministic though: sometimes the heap size stabilizes in the
140–300 MiB range, and sometimes it keeps growing endlessly even though
the table size reaches a maxium at 7,190,537 entries.
Ludo’.
This bug report was last modified 7 years and 202 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.