Есть список ip-адресов и трафику для каждого адреса. список в простом текстовом файле.
формат: [IP-адрес] [Bytes]
Проблема в том, что размер списка несколько миллионов строк.
Как лучше реализовать группировку IP-адресов с сумированием Байтов.
Ложить всё в массив... я думаю это безумство :-)
>Есть список ip-адресов и трафику для каждого адреса. список в простом текстовом
>файле.
>формат: [IP-адрес] [Bytes]
>Проблема в том, что размер списка несколько миллионов строк.
>Как лучше реализовать группировку IP-адресов с сумированием Байтов.
>Ложить всё в массив... я думаю это безумство :-)СУБД
Можно простым файлом обойтись :)Так как ip адресов конечно (2^32) можно использовать их все как массив.
то есть 4 байта ip использовать как (unsigned long int) индекс :)Сам массив хранить в файле.
То есть, ip адресу 0.0.0.0 соотв индекс (смещение 0), 0.0.0.1 смещение 1.
Правда файл получится 32 гигабайта. Но наверно разреженный, так что не страшно :)
>Проблема в том, что размер списка несколько миллионов строк.
>Ложить всё в массив... я думаю это безумство :-)На самом деле, важно не сколько строк, а сколько в них разных адресов.
Так что использовать какую-нибудь разновидность массива (например std::map из C++/STL) может оказаться не такой уж и плохой идеей. Если нужна только сумма трафика для каждого адреса.
Думаю лучше сделать в СУБД (как посоветовал newser).
Масштабируемость получается больше. Потому что рано или поздно будет затребовано деление трафика по портам/адресам и самое эффективое пихать всё в БД.
>всё в массив... я думаю это безумство :-)нахрена в массив? Читаем файл построчно, в памяти храним только таблицу IP - сумма байт для встретившихся IP. Логично использовать хэш.
На C++ - std::hash_map и прога из двух десятков строчек.
На Perl - стандартный хэш и прога из четырех строк.