Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как лучше поступить? Подскажите с методом 
:(
    Опции темы
null56
Дата 8.10.2009, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Опишу ситуацию
У меня есть файл, такого формата
Цитата

121195296,121195327,IT
152305664,152338431,GB
205500988,205500991,CA
205502668,205502671,US
214858656,214858671,NL
251658240,260227071,FR
260227072,260231167,GB
.....

Это начальное и конечное значение диапозона ip адресов стран... сама страна указана в третьем столбце.
Величина файла в строках: 85000
Я хочу использовать этот файл для определения страны, к которой принадлежит тот или иной сервер. Частота обращений к файлу заранее неизвестна

В чем проблема
Я хотел бы поинтересоваться у вас, как мне лучше обращаться к этому файлу, потому что мне на ум приходят три способа....

1) Хранение распарсеной информации в памяти
Подразумевается один раз открыть файл, распарсить и сложить куда - нибидь в список. Под списком подразумеваю либо std::vector или Qlist из библиотеки Qt или же самописный односвязный список. При необходимости можно пройтись по списку, тупо прямо и определить к какой стране относится адрес
Но: Если я распарсю всю инфу и сохраню в памяти, то это будет: (4 байта(начало диапазона) + 4 Байта(конец диапазона) + 2 байта) * 80000(строк) = много
Отсюда первый вопрос: хранить такое количество байтов в памяти для быстрого доступа обосновано?
И второй вопрос: справятся ли для этой цели стандартные контейнеры (list или vector)?

2) Можно постоянно считывать данные с файла на диске. Тупо открыть его в начале работы программы, а при необходимости обновления того или иного сервера, запускать просмотр строк файла
Вопрос 3: не будет ли это слишком долго? для приложения

3) Третий способ это отображения файла в адресное пространство процесса (mmap), в этом случае я выиграю с задержками, связанными с обращению к файловой системе. То есть висит в памяти файл, размером 2 мегабайта и происходит парсинг его с начала... хотя это не очень здорово наверное

В одном случае я выигрываю на парсинге, в другом в структурах в памяти
И так, это то, что мне пришло на ум, но может вы мне подскажите, что лучше, или предложите какую - нибудь свою идею?
Заранее благодарен за помощь
PM MAIL   Вверх
Alek86
Дата 8.10.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



блин, запарился, пока отвечал

короче 800000 байт - это немного

Это сообщение отредактировал(а) Alek86 - 8.10.2009, 15:51


--------------------
user posted image    user posted image
PM MAIL   Вверх
Anikmar
Дата 8.10.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Alek86 @  8.10.2009,  15:49 Найти цитируемый пост)
короче 800000 байт - это немного

Почему 800000?
85000 диапазонов IP.
IP - это 4-хбайтовое число
Итого 680000 байт, примерно 550 кб
Сразу загнать в массив

Это сообщение отредактировал(а) Anikmar - 8.10.2009, 16:19
PM MAIL ICQ   Вверх
Void
Дата 8.10.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Для классификации IP адресов есть масса хитроумных структур данных, потому что в это упирается вся маршрутизация.
Линейный поиск некошерен при сколько-нибудь частых обращениях. Диапазоны не пересекающиеся и набор редко меняется, можно хотя бы упорядочить их в массиве и искать бинарным поиском.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
azesmcar
Дата 8.10.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Я бы залил все в базу, но если базы нет - текстовый файл тоже база, в данном случае (csv) comma separated values, через ADO smile 
PM   Вверх
null56
Дата 8.10.2009, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



ну как, два числа на диапазон + два символа, которые позволяет сформировать файлик с флагом...
и того 4 + 4 + 2 = 10 байт (без упаковок) на одну структуру + 4 байта на один указатель = 16 * 85000 = 1 360 000 байт в памяти
здесь же речь о нижней и верхней границе

Добавлено через 2 минуты и 7 секунд
Void, а смысл упорядочивания? я же не знаю, как мне адрес попадется и среднее время поиска никак от сортировки не изменится
PM MAIL   Вверх
azesmcar
Дата 8.10.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(null56 @  8.10.2009,  16:28 Найти цитируемый пост)
Void, а смысл упорядочивания? я же не знаю, как мне адрес попадется и среднее время поиска никак от сортировки не изменится 

Смысл упорядочивания как уже написали - бинарный поиск.
PM   Вверх
Alek86
Дата 8.10.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(Anikmar @  8.10.2009,  16:18 Найти цитируемый пост)
Почему 800000?85000 диапазонов IP.IP - это 4-хбайтовое числоИтого 680000 байт, примерно 550 кб

эээ
я исходил из
Цитата(null56 @  8.10.2009,  15:40 Найти цитируемый пост)
(4 байта(начало диапазона) + 4 Байта(конец диапазона) + 2 байта) * 80000(строк)




--------------------
user posted image    user posted image
PM MAIL   Вверх
null56
Дата 8.10.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Мда... что - то я не обратил внимание, что диапазоны подряд идут...  если дырок быть не может в этом файле, то конец диапазона, можно в памяти не хранить... надеюсь, что так
PM MAIL   Вверх
Void
Дата 8.10.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(null56 @  8.10.2009,  18:43 Найти цитируемый пост)
Мда... что - то я не обратил внимание, что диапазоны подряд идут...  если дырок быть не может в этом файле, то конец диапазона, можно в памяти не хранить... надеюсь, что так 

«Дырки» могут быть, не весь адреса IPv4 (пока ещё) присвоены.
Цитата(Alek86 @  8.10.2009,  18:35 Найти цитируемый пост)
(4 байта(начало диапазона) + 4 Байта(конец диапазона) + 2 байта) * 80000(строк)

Хранить IP-диапазоны в таком виде — в некотором роде изврат, ибо CIDR. Проверять принадлежность проще по сети и маске подсети.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
null56
Дата 8.10.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



файл взят отсюда
http://ip-to-country.webhosting.info/downl...country.csv.zip

и обработан в шеле
Код

cut -d, -f0-3 < ip-to-country.csv|sed 's/"//g' > geoip


Уж не знаю, подтвердится ли утверждение о неразрывности

Добавлено через 2 минуты и 45 секунд
вообще дырка в конце файла, на счет середины сложно так сказать
Цитата

..............................................
3741024256,3741057023,KR
3741057024,3741319167,VN
4278190080,4294967295,US
конец файла

PM MAIL   Вверх
Anikmar
Дата 8.10.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Даже если и по 10 байт на диапазон - загнать все в один массив отсортировать по началу диапазона и не парится.

Цитата(Void @  8.10.2009,  16:51 Найти цитируемый пост)
Хранить IP-диапазоны в таком виде — в некотором роде изврат, ибо CIDR. Проверять принадлежность проще по сети и маске подсети. 

Может я чего-то недопонимаю, но маски и подмаски - это уже внутрипротокольное дело. IP4 - это обычный стандартный long, маска там нужна для маршрутизации, но ни как для определения вхождения адреса в диапазон. Или существуют 2 одинаковых адреса IP но с разными масками, идинтифицирующие разные хосты?
PM MAIL ICQ   Вверх
Void
Дата 8.10.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Anikmar @  8.10.2009,  19:02 Найти цитируемый пост)
Может я чего-то недопонимаю, но маски и подмаски - это уже внутрипротокольное дело. IP4 - это обычный стандартный long, маска там нужна для маршрутизации, но ни как для определения вхождения адреса в диапазон. Или существуют 2 одинаковых адреса IP но с разными масками, идинтифицирующие разные хосты? 

Все диапазоны из вышеуказанного списка имеют форму xxx(N нулей) — xxx(N единиц). Nuff said.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
null56
Дата 8.10.2009, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Void, по подробнее можно, как ты предлагаешь искать принадлежность диапазону?

Добавлено через 1 минуту и 18 секунд
как ты предлагаешь отличить, например, вот эти два диапазона
Цитата

3706224640,3706257407,HK
3706257408,3706322943,AU

PM MAIL   Вверх
GoldFinch
Дата 8.10.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



очевидно по маске
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0601 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.