Обновление: Если вы сохранили все 4 миллиарда адресов IPv4 в виде одного массива, вы можете представить время как отдельный короткий.
short[] ipv4 = new short[Integer.MAX_VALUE * 2]; // technically not possible blah blah
Это будет 8 ГБ с 65 КБразрешение по времениПросто подумайте, потому что это накладывает верхнюю границу на память, потому что любая другая схема должна быть под этим.Если вы используете байт, это будет 256-кратное разрешение для 337,5 с на бин и 4 ГБ.
Теперь вам остается только сказать, что вы видели хотя бы пакет внутри этого сегмента.Если вам нужен счетчик, который снова увеличивает объем памяти, но с коротким замыканием вы можете использовать 1024 сегмента с потенциальным 6-битным разрешением для подсчета: максимум 64 пакета.
Теперь со 100 миллионами уникальных IP-адресов, которые уменьшают объем памяти в 10 раз, поэтому вы теоретически перешли с 8 ГБ до 800 МБ.Не выделяя всего пространства, вы думаете, что можете сэкономить память, но вам все равно придется хранить 4 байта на IP: 400 МБ только для IP-адресов + 400 МБ для некоторой структуры сортировки для их хранения (указатели 100 МБ * 4 байта) и 2 байта длявремя: минимум 1 ГБ.Распределяя все пространство, вы получаете возможность пропустить повторное сохранение IP, потому что ваш хэш - это ваш IP.Если вы уменьшите массив, у вас больше не будет IP, потому что он был хеширован.Теперь вы не можете сохранить IP-адрес и по-прежнему отвечать на вопросы с данным IP-адресом, но вы не можете его отрыгнуть.
Что если вы сохранили ряд масок подсетей, а затем свернули все IP-адреса под ним исохраняйте свою статистику по этой маске подсети.Например, у вас есть 256 подсетей с собственной маской подсети.Ваша программа будет иметь нижнюю границу маски.Это означает, что если вы маскируете 209.134.0.0/16 и используете нижнюю границу 8. Тогда это создаст 256 бинов для этой подсети, которые были отделены от 209.134.0.0-209.134.255.255.Вы бы повторили тот же процесс для всех 256 подсетей, которые у вас есть.С нижней границей 8 бит означает, что нижние 256 адресов каждой подсети будут свернуты.Вы можете хэшировать любой IP-адрес в корзину и хранить статистику в памяти.Однако ничего нельзя сказать об одном IP-адресе.Но, если вам нужно больше разрешения, вы можете просто сбросить нижнюю маску подсети, скажем, до 4, и теперь есть больше корзин.
Вы создаете корзину только в том случае, если у вас есть 1 IP внутри, поэтому, если у вас нет IP-адресов, отображаемых там, вы можете сэкономить некоторое пространство, так что баланс выполняется между достаточно низким для разрешения спуска, но достаточно высоким, чтобы пропуститьсоздание корзин для вещей, которые вам не нужны.
Затем вы можете записать журнал каждой корзины и отследить, что произошло в каждой корзине на диске.Если вы хотите ответить на вопрос об одном IP-адресе, выясните, к какой корзине он принадлежит, затем откройте файл и найдите его там, чтобы найти ответ.Эта схема означает, что вы можете увеличивать или уменьшать масштаб в зависимости от размера ваших данных, а также увеличивая и понижая свои границы.Вы можете повысить производительность, изменив структуру файлов, которые вы записываете для каждого бина.
Я знаю, извините за длину!: -)