Все IP адреса в мире легко засунутся в 16 гигабайт. Не так уж и много.
Грубо говоря, это задача про сжатие информации, и в зависимости от статистического распределения входного файла, будут хорошо работать разные алгоритмы храниения. Например, если в файле много адресов, идущих подряд, хорошо будет работать такой способ:
Делаем древовидную структуру, например по октетам.
Если взять первые два октета, нам потребуется всего 65536 бакетов.
В каждом бакете у нас будет 256 слотов, в каждом слоте - еще 256 отрезков адресов. Если нам повстречались все 256 вариантов самого младшего октета, у нас весь отрезок аккуратно схлопнется.
То есть в листьях дерева мы храним не сами адреса, а пары (база, количество)