On Monday, June 24, 2013, Noah Misch wrote: > On Sat, Jun 22, 2013 at 03:46:49AM -0400, Stephen Frost wrote: > > * Noah Misch (n...@leadboat.com <javascript:;>) wrote: > > > The next limit faced by sorts is > > > INT_MAX concurrent tuples in memory, which limits helpful work_mem to > about > > > 150 GiB when sorting int4. > > > > That's frustratingly small. :( > > I could appreciate a desire to remove that limit. The way to do that is to > audit all uses of "int" variables in tuplesort.c and tuplestore.c, changing > them to Size where they can be used as indexes into the memtuples array.
Right, that's about what I figured would need to be done. > Nonetheless, this new limit is about 50x the current limit; you need an > (unpartitioned) table of 2B+ rows to encounter it. I'm happy with that. Definitely better but I could see cases with that many tuples in the not-too-distant future, esp. when used with MinMax indexes... > > > ! if (memtupsize * grow_ratio < INT_MAX) > > > ! newmemtupsize = (int) (memtupsize * grow_ratio); > > > ! else > > > ! newmemtupsize = INT_MAX; > > > > > > /* We won't make any further enlargement attempts */ > > > state->growmemtuples = false; > > > > I'm not a huge fan of moving directly to INT_MAX. Are we confident that > > everything can handle that cleanly..? I feel like it might be a bit > > safer to shy a bit short of INT_MAX (say, by 1K). Perhaps that's overly > > paranoid, but there's an awful lot of callers and some loop which +2's > > and then overflows would suck, eg: > > Where are you seeing "an awful lot of callers"? The code that needs to be > correct with respect to the INT_MAX limit is all in > tuplesort.c/tuplestore.c. > Consequently, I chose to verify that code rather than add a safety factor. > (I > did add an unrelated safety factor to repalloc_huge() itself.) Ok, I was thinking this code was used beyond tuplesort (I was thinking it was actually associated with palloc). Apologies for the confusion. :) > > Also, could this be used to support hashing larger sets..? If we change > > NTUP_PER_BUCKET to one, we could end up wanting to create a hash table > > larger than INT_MAX since, with 8-byte pointers, that'd only be around > > 134M tuples. > > The INT_MAX limit is an internal limit of tuplesort/tuplestore; other > consumers of the huge allocation APIs are only subject to that limit if > they > find reasons to enforce it on themselves. (Incidentally, the internal > limit > in question is INT_MAX tuples, not INT_MAX bytes.) There's other places where we use integers for indexes into arrays of tuples (at least hashing is another area..) and those are then also subject to INT_MAX, which was really what I was getting at. We might move the hashing code to use the _huge functions and would then need to adjust that code to use Size for the index into the hash table array of pointers. Thanks, Stephen