С практической точки зрения было бы легко сделать это с BerkeleyDB, , как предложил Лирик.
Если вы больше интересуетесь теорией, чем практикой, я бы посоветовал вам подходить к этому как к операции "внешней сортировки". То есть прочитайте как можно больше ввода в память, а затем сортируйте по ключу Запишите отсортированный фрагмент как один файл. Отсортированные файлы могут быть легко объединены в один файл.
Среди других приложений, это подход, используемый Lucene для создания «инвертированных индексов» для поиска текста. «Ключи» - это слова в документах, а «значения» - это список документов, в которых встречается слово. Lucene читает документы и для каждого слова создает запись в документе. Когда память заполнена, она записывает сегмент индекса на диск. Когда на диске много сегментов индекса, они объединяются в один сегмент. Фактически, вы также можете адаптировать индексатор Lucene к вашей задаче.
Работа может быть разделена на несколько потоков. Однако вы должны быть чувствительны к конфликту дисков. Пропуск одновременного чтения и записи большого количества файлов значительно замедлит работу обычного диска. Там могут быть возможности для планирования некоторых мероприятий одновременно. Возможно, вы могли бы прочитать новые данные из одного файла во время записи предыдущего отсортированного фрагмента на диск, особенно если на машине установлено два дисковода. Конечно, использование SSD для временного хранения некоторых из отсортированных сегментов очень помогло бы.