Даже если каждое число по 4 байта, то это
1000000 * 1000000 * 4 / 1024/1024/1024/1024 = 3.7 Терабайта.
В оперативку уж точно не вместиться.
Итак, если там однобайтовые числа. Заводим массив на 256 элементов, проходимся последовательно по оригинальному массиву. Используя число как индекс смотрим в первом массиве значение. Если там 0, записываем 1, если единица - пишем 2, если 2 - не трогаем.
По окончанию просмотра большого массива смотрим в маленький. Там, где значения нулевые, этих элементов нет, где 1 - для них нет дубликатов. Где двойки - там есть дубликаты. Сложность алгоритма - O(n).
Если числа двухбайтовые, то тут суть та же, 64к массив - это не так много.
Если числа 4-байтовые, то тут придется немного помучаться, так как заводить массив на 4 гигабайта (на каждое число по байту) как-то накладно, можно паковать по 4 числа в байт (на кодирования наличия элемента нужно всего два бита). Это "всего" 1 гигабайт (если нашлось место для 4 терабайт данных, то один гиг найдется). Если памяти мало, то можно попробовать паковать блоки, то есть хранить не одним массивом, а разбить на блоки, к примеру, по 1024 элемента. Если в блоке хранятся одинаковые числа, то можно просто хранить это значение.