![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
[IMG]http://img258.**************/img258/5653/combobox.jpg[/IMG]
Добрый день, появилась необходимость создания combobox`а с подстановкой значений. К рассмотрению возьмем - список городов, ...т.е. вводим первые буквы города получаем в списках наиболее подходящий вариант. Коллеги, подскажите пожалуйста принцип работы. Интересуют сл. вопросы: 1. При вводе данных в combobox подгружать варианты с напрямую с сервера? > насколько при это критична нагрузка на базу данных? 2. При вводе данных в combobox подгружать варианты с напрямую с сервера? > с учетом того что подгружаемые данные уже кэшированны на сервере; 3. Предварительная загрузка полных списков, и уже в дальнейшем работа с данными списками на прямую на стороне клиента; > насколько критична нагрузка на память? Хотелось бы что бы вы поделились принципом работы данной реализации, потому как я не могу остановиться на каком то конкретном варианте и не исключается что в целом пока не имею правильный вариант реализации вообще. |
|
|||||
|
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Зависит от количества вариантов, если их ~15000, заранее они не известны и список динамически изменяются, то очевидно, что нужно подружать с сервера по мере ввода. (про нагрузку на бд спросите у вашего серверника, многое зависит от реализации выборки
) Если вариантов 5, и они постоянные, то не менее очевидно, что лучше их хранить на клиенте, либо подгружать один раз.
__________________
#flasher@irc.trg.ru:6667 |
|
|||||
|
Одновременных подключений к базе данных может быть до 200 (Firebird SQL database), вариантов данных в списках так же может быть ооочень много (списки городов я взял к примеру). Думаю что нужно для начала организовать надежную систему кеширования на сервере и отдавать результаты или из кеша ...или (если по ключам запроса данных нет в кэше) из базы данных - в кэш и параллельно на сторону клиента.
Пожалуйста поправьте меня если я не прав! |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
1. Если нормально сделать, то некритична.
2. По каждому нажатию кнопки отправлять HTTP запрос - плохая идея. Сокет вполне осилит нужную интерактивность (но вообще-то его нужность под вопросом, проблемы с проксями итп.). Может, грузить список после ввода 1-2 символов, лучше сжатый. Однозначно нужен список, вшитый во флешку или загруженный изначально, из городов которого там 90% юзеров будут. Может, грузить что-то только если введённого юзером нет в базовом списке. 3. А сколько у вас городов всего, сколько весит список городов, сколько он весит заархивированный? А чем текущая реализация-то не устраивает? Тут скорее надо прыгать, а не думать.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Список городов - все! )) ...международная система, в том же проекте еще много других очень больших списков. Систему первое время придется "учить", ...списки будут пополнятся! Подстановка значений нужна для того, что бы пользователь максимально быстро находил свой вариант записи, ...что бы не разводили одни и те же слова в нескольких разных интерпретациях (еще и с ошибками).
|
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Ну типа 2 млн. городов, ну пусть 10 млн. - меньше 30 шагов по бинарному дереву, нормальная организация бд или своё дерево и проблем со временем доступа у сервера нет, но загрузить всё нельзя. Я бы таки сделал вариант - 10к городов вшить/грузить (менее 100 кб), если юзер вводит то, чего нет там (что редко (а может вообще никогда, если он не бред пишет), тогда он подождёт ответа сервака).
Максимально быстро и интерактивно - запрос на сервер слать через сокет, если имеющееся не может предложить n (напр 5) вариантов, сервер отдает не более m*n (m напр 6) новых вариантов.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Если списки взаимозависимые (например: страна -> регион -> город), то можно обойтись и простыми HTTP запросами с предзагрузкой на каждом шаге. Количество вариантов на каждом шаге будет на порядок меньше. Если база на все города, то могут быть проблемы с написанием города, как то, различные варианты транслитерации, запись латиницей / кирилицей / национальным алфавитом и т.д.
|
|
|||||
|
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
Ну кстати говоря -De- прав, поиск по вектору из 100000 строк проходит за ~70 мс. Т.е. можно сразу загрузить большое количество популярных городов (ну скажем с населением больше 500 тыс. человек)
Код теста: var strVector:Vector.<String> = getStringVector(100000); var startTime:Number = new Date().getTime(); var stringCount:int = strVector.length; var matchCount:int = 0; for(var i:int = 0; i < stringCount; i++) { var str:String = strVector[i]; if(str.substr(0, 3) == "cfd") { matchCount ++; } } trace(matchCount, 'found in :', new Date().getTime() - startTime); function getStringVector(count:int):Vector.<String> { var vec:Vector.<String> = new Vector.<String>; for(var i:int = 0; i < count; i++) { vec.push(getRandomString()); } return vec; } function getRandomString():String { var letters:Array = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; var letterCount:int = int(Math.random()*4 + 5); var str:String = ''; while(--letterCount > 0) { str += letters[int(Math.random()*6)]; } return str; } Цитата:
![]()
__________________
#flasher@irc.trg.ru:6667 Последний раз редактировалось Obi; 21.10.2010 в 15:09. |
|
|||||
|
Цитата:
|
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Если правильно, то за ~0 мс ищет)
Ну и вообще то, что оно находит и правильное название города - разные штуки, можно, например, в вектор, кроме строки засунуть ссылку на правильный город. var strVector:Vector.<String> = getStringVector(100000); var startTime:Number = new Date().getTime(); var stringCount:int = strVector.length; var matchCount:int = 0; var from:int = 0; var to:int = stringCount; var test:int; while (true) { test = (from + to) / 2; var compResult:int = strVector[test].localeCompare("cfd"); if (compResult == 0) { matchCount = 3; break; } else { if (Math.abs(from - to) == 1) { var compFrom:int = Math.abs(strVector[from].substr(0, 3).localeCompare("cfd")); var compTo:int = Math.abs(strVector[to].substr(0, 3).localeCompare("cfd")); if (compFrom > compTo) { test = to; matchCount = 3 - compTo; } else { test = from; matchCount = 3 - compFrom; } break; } if (compResult < 0) { from = test; } else to = test; } trace(from, to);//вообще неплохо бы убрать для скорости } trace(matchCount, 'found in :', new Date().getTime() - startTime, "String is ",strVector[test]); function compare(v1:String, v2:String):Number { return Number(v1.localeCompare(v2)); } function getStringVector(count:int):Vector.<String> { var vec:Vector.<String> = new Vector.<String>; for(var i:int = 0; i < count; i++) { vec.push(getRandomString()); } //сортировка НЕ делается при поиске, она делается при генерации/изменении списка vec.sort(compare); return vec; } function getRandomString():String { var letters:Array = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; var letterCount:int = int(Math.random()*4 + 5); var str:String = ''; while(--letterCount > 0) { str += letters[int(Math.random()*6)]; } return str; }
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. Последний раз редактировалось -De-; 21.10.2010 в 16:51. |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:05. |
|
|
« Предыдущая тема | Следующая тема » |
|
|