1. A method comprising: receiving data and packaging the data into a set of records; placing the set of records into a set of pages to form a sort run until reaching a memory limit; sorting the set of records in the sort run based on key values of the set of records; gathering metadata regarding content of the sort run providing an identification of a number of records in each page, including metadata regarding the key values of the set of records in the sort run and a list of key values occurring on page boundaries of the sort run; determining, by a computing device, boundary values dynamically defining key value bounds of two or more disjoint subsets of the sort run based on the metadata, the two or more disjoint subsets having a proportional number of pages and records; and outputting sorted data from the two or more disjoint subsets of the sort run in parallel.