Форум сайта python.su
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png) 
			 
							 0
  0   
								
								Нужно работать с большими списками ip адрессов UA-AIX ~ 1900 диапазонов.
выборка в стиле:
“ есть ip  в списке этих диапазонов - или нет? ” 
плюс есть требование по производительности решения. 
Пока смотрю на IPy, но вдруг комрады подскажут чего? По сути задача сводится к поиску в бинарном массиве.
Офлайн
 
							 14
  14   
								
								А какие рамки по производительности?
Мерял? Не хватало?
По моему 2000 диапазонов отстрелятся почти мгновенно - не миллион же.
IPy - вполне приличная вещь. Есть еще iplib. Дело вкуса
Офлайн
 
							 0
  0   
								
								IPy не умеет сравнивать диапазоны.  
а в таком виде  и так 2000 диапазонов… вообще не весело и не пролетает!
при пересчете статистики с NetFlow, вы представляете сколько таких сравнений может быть в цикле? Но в корне будет именно эта операция, а значит ее нужно максимально оптимизировать.
Я вот думаю перегонять весь список диапазонов в сортированный спискок бинарных ip.
И за тем с ним сравнивать опять таки бинарный ип…. Но стоит ли овчинка?
Отредактировано (Июль 3, 2007 18:42:00)
Офлайн
 
							 14
  14   
								
								Если серьезно повышать скорость - следует делать дерево. Только лучше не совсем бинарное. Обычно в диапазонах первые три байта - целые (в смысле маска 255.255.255.ххх). Начало можно находить быстро (в три приема будет оптимальней, чем большой сортированный список), а хвост уже побитно смотреть. Легко перейти к более общему виду - учесть маски 255.255.ххх.ххх, 255.ххх.ххх.ххх и т.д.
Простой bisort по большому списку будет, думаю, медленней.
Еще можно это все на плюсах сделать - поиск имеет все шансы ускориться.
Честно говоря, не помню, как устроены IPy и iplib - может, что-то такое в них и есть.
Я такую реализацию видел где-то на плюсах. Где - уже не вспомню.
Отредактировано (Июль 3, 2007 18:52:27)
Офлайн
 
							 0
  0   
								
								Андрей СветловНаверное прийдется вспоминать С. Либо юзать inet_type in PostgreSQL. Кстати там эта функция отлично реализована.
Если серьезно повышать скорость - следует делать дерево. Только лучше не совсем бинарное. Обычно в диапазонах первые три байта - целые (в смысле маска 255.255.255.ххх). Начало можно находить быстро (в три приема будет оптимальней, чем большой сортированный список), а хвост уже побитно смотреть. Легко перейти к более общему виду - учесть маски 255.255.ххх.ххх, 255.ххх.ххх.ххх и т.д.
Простой bisort по большому списку будет, думаю, медленней.
Еще можно это все на плюсах сделать - поиск имеет все шансы ускориться.
Честно говоря, не помню, как устроены IPy и iplib - может, что-то такое в них и есть.
Я такую реализацию видел где-то на плюсах. Где - уже не вспомню.
Офлайн
 
							 14
  14   
								
								И все таки советую собрать быстро прототип на какой-нибудь готовой либе. 
Начальству показать и т.д.
А потом можно будет долго и весело поиск ускорять.
Офлайн
 
							 0
  0   
								
								Я так поступал:
Преобразование IP из строки в целое:
IpInt = struct.unpack('!L',socket.inet_aton(IpStr))[0]IpStr = socket.inet_ntoa(struct.pack('!L', IpInt)print struct.unpack('!L',socket.inet_aton('0.0.0.0'))[0]
print struct.unpack('!L',socket.inet_aton('192.168.0.0'))[0]
print struct.unpack('!L',socket.inet_aton('192.168.0.1'))[0]
print struct.unpack('!L',socket.inet_aton('255.255.255.255'))[0]
--------------------------------------------------
0
3232235520
3232235521
4294967295Отредактировано (Июль 3, 2007 22:07:20)
Офлайн
 
							 0
  0   
								
								Упс. Сори. Только сейчас братил внимание на то что нужно с диапазонами.
Офлайн
 
							 0
  0   
								
								Офлайн
![[RSS Feed] [RSS Feed]](/static/djangobb_forum/img/feed-icon-small.png)