Прежде всего, я отмечаю, что вы можете сортировать файл, не занимая его всю память, и что в большинстве операционных систем есть программы, которые делают это, часто называемые просто «сортировать». Обычно его можно отсортировать по полю внутри файла, но если нет, вы можете переписать каждую строку, чтобы отсортировать его так, как вы хотите.
Учитывая это, вы можете соединить два файла, отсортировав их так, чтобы первый сортировался в поле № 1, а второй - в поле № 2. Затем вы можете создать одну запись для каждого совпадения, объединяя все поля и сохраняя в памяти только фрагмент каждого файла, в котором все поля, по которым вы отсортировали, имеют одинаковое значение. Это позволит вам связать результат с другим файлом - четыре таких соединения должны решить вашу проблему.
В зависимости от ваших данных, время, необходимое для решения вашей проблемы, может зависеть от порядка, в котором вы устанавливаете соединения. Один из довольно наивных способов использовать это на каждом этапе - брать небольшую случайную выборку из каждого файла и использовать ее, чтобы увидеть, сколько результатов последует из каждого возможного соединения, и выбрать соединение, которое дает наименьшее количество результатов. Один из способов получить случайную выборку из N элементов из большого файла - это взять первые N строк в файле, а затем, когда вы уже прочитали m строк, прочитать следующую строку, а затем с вероятностью N / (m + 1) обменять одну из N строк, удерживаемых для него, иначе выбросить. Продолжайте, пока не прочитаете весь файл.