l...@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’.