Как вы предполагаете, проблема заключается в чтении всех этих чисел и преобразовании из текста в двоичный файл.
Лучшее улучшение - записывать числа из любой программы, которая генерирует их как двоичные. Это значительно сократит объем данных, которые необходимо прочитать с диска, и немного сократит время, необходимое для преобразования текста в двоичный файл.
Вы говорите, что 2 000 000 номеров занимают 18 МБ = 9 байтов на число. Это включает пробелы и маркеры конца строки, поэтому звучит разумно.
Хранение чисел в виде 4-байтовых целых будет вдвое меньше данных, которые должны быть прочитаны с диска. Наряду с экономией на преобразовании форматов было бы разумно ожидать удвоения производительности.
Поскольку вам нужно еще больше, требуется нечто более радикальное. Вы должны разбить файл данных на отдельные файлы, каждый на своем диске, а затем обработать каждый файл в своем собственном процессе. Если у вас есть 4 ядра и вы разбили процесс обработки на 4 отдельных процесса и можете подключить 4 высокопроизводительных диска, вы можете надеяться на еще одно удвоение производительности. Узким местом теперь является управление дисками ОС, и невозможно догадаться, насколько хорошо ОС будет управлять четырьмя дисками параллельно.
Я предполагаю, что это чрезвычайно упрощенная модель обработки, которую вам нужно сделать. Если ваше описание - это все, что нужно, реальным решением будет вычитание в программе, которая записывает тестовые файлы!