From c2f590dc9a08dabcd18411bd4a4b85a0a82c2c08 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 10 Jul 2012 16:14:33 -0700 Subject: sort: by default, do not exceed 3/4 of physical memory * src/sort.c (default_sort_size): Do not exceed 3/4 of total memory. See Jeff Janes's bug report in . --- src/sort.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/sort.c b/src/sort.c index 10103e962..85d7869de 100644 --- a/src/sort.c +++ b/src/sort.c @@ -1412,9 +1412,10 @@ specify_nthreads (int oi, char c, char const *s) static size_t default_sort_size (void) { - /* Let SIZE be MEM, but no more than the maximum object size or - system resource limits. Don't bother to check for values like - RLIM_INFINITY since in practice they are not much less than SIZE_MAX. */ + /* Let SIZE be MEM, but no more than the maximum object size, + total memory, or system resource limits. Don't bother to check + for values like RLIM_INFINITY since in practice they are not much + less than SIZE_MAX. */ size_t size = SIZE_MAX; struct rlimit rlimit; if (getrlimit (RLIMIT_DATA, &rlimit) == 0 && rlimit.rlim_cur < size) @@ -1441,6 +1442,10 @@ default_sort_size (void) double total = physmem_total (); double mem = MAX (avail, total / 8); + /* Leave a 1/4 margin for physical memory. */ + if (total * 0.75 < size) + size = total * 0.75; + /* Return the minimum of MEM and SIZE, but no less than MIN_SORT_SIZE. Avoid the MIN macro here, as it is not quite right when only one argument is floating point. */ -- cgit v1.2.3-70-g09d2