I notice that the implementation of expand_array() in tables/apr_hash.c allocates a new bucket array, without making any attempt to release the memory allocated for the previous bucket array. That wastes memory: if the hash table grows exponentially, this strategy wastes O(n) extra memory.
Is there a rational for the current behavior? If not, perhaps the easiest fix is to allocate the bucket array in a subpool, and then create a new subpool and destroy the old one in expand_array(). If a patch to do this would be accepted, let me know and I'll submit one. Neil