A system comprising: a storage device storing a plurality of data records, each of the plurality of data records including one of a plurality of key values, wherein various data records are assigned to respective ones of two or more processing units; a processor; and a memory storing processor-executable program code executable by the processor to cause each processing unit to execute the following steps independently and in parallel: determine (S305) a first plurality of the plurality of data records assigned to a first processing unit; identify (S310) a first record of the first plurality of data records, the first record including a first key value; generate (S315) a first dictionary entry of a first dictionary for the first key value; store (S320) a first identifier of the first record as a tail identifier and as a head identifier in the first dictionary entry; store (S325) an end flag in a first shared memory location, the first shared memory location associated with the first record; identify (S335) a second record of the first plurality of data records, the second record including the first key value; replace (S345) the tail identifier in the first dictionary entry with a second identifier of the second record; and store (S350) the first identifier in a second shared memory location, the second shared memory location associated with the second record. a storage device storing a plurality of data records, each of the plurality of data records including one of a plurality of key values, wherein various data records are assigned to respective ones of two or more processing units; a processor; and a memory storing processor-executable program code executable by the processor to cause each processing unit to execute the following steps independently and in parallel: determine (S305) a first plurality of the plurality of data records assigned to a first processing unit; identify (S310) a first record of the first plurality of data records, the first record including a first key value; generate (S315) a first dictionary entry of a first dictionary for the first key value; store (S320) a first identifier of the first record as a tail identifier and as a head identifier in the first dictionary entry; store (S325) an end flag in a first shared memory location, the first shared memory location associated with the first record; identify (S335) a second record of the first plurality of data records, the second record including the first key value; replace (S345) the tail identifier in the first dictionary entry with a second identifier of the second record; and store (S350) the first identifier in a second shared memory location, the second shared memory location associated with the second record. determine (S305) a first plurality of the plurality of data records assigned to a first processing unit; identify (S310) a first record of the first plurality of data records, the first record including a first key value; generate (S315) a first dictionary entry of a first dictionary for the first key value; store (S320) a first identifier of the first record as a tail identifier and as a head identifier in the first dictionary entry; store (S325) an end flag in a first shared memory location, the first shared memory location associated with the first record; identify (S335) a second record of the first plurality of data records, the second record including the first key value; replace (S345) the tail identifier in the first dictionary entry with a second identifier of the second record; and store (S350) the first identifier in a second shared memory location, the second shared memory location associated with the second record. <EOS>