- return b->hash_bits && ctx->radix_split &&
- !(sorter_debug & SORT_DEBUG_NO_RADIX) &&
- sbuck_size(b) > (sh_off_t)sorter_bufsize;
+ if (!b->hash_bits || !ctx->radix_split ||
+ (b->flags & SBF_CUSTOM_PRESORT) ||
+ (sorter_debug & SORT_DEBUG_NO_RADIX))
+ return 0;
+
+ u64 in = sbuck_size(b);
+ u64 mem = ctx->internal_estimate(ctx, b) * 0.8; // FIXME: Magical factor for hash non-uniformity
+ if (in <= mem)
+ return 0;
+
+ uns n = sorter_min_radix_bits;
+ while (n < sorter_max_radix_bits && n < b->hash_bits && (in >> n) > mem)
+ n++;
+ return n;