Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.10.2010, 12:58
ERrorMAKros вне форума Посмотреть профиль Отправить личное сообщение для ERrorMAKros Посетить домашнюю страницу ERrorMAKros Найти все сообщения от ERrorMAKros
  № 1  
Ответить с цитированием
ERrorMAKros
 
Аватар для ERrorMAKros

Регистрация: May 2008
Адрес: Земля.Украина.Одесса
Сообщений: 219
Отправить сообщение для ERrorMAKros с помощью ICQ Отправить сообщение для ERrorMAKros с помощью Skype™
Question ComboBox с подстановкой значений "на ходу" и его принцип создания

[IMG]http://img258.**************/img258/5653/combobox.jpg[/IMG]
Добрый день,
появилась необходимость создания combobox`а с подстановкой значений. К рассмотрению возьмем - список городов, ...т.е. вводим первые буквы города получаем в списках наиболее подходящий вариант.

Коллеги, подскажите пожалуйста принцип работы. Интересуют сл. вопросы:
1. При вводе данных в combobox подгружать варианты с напрямую с сервера?
> насколько при это критична нагрузка на базу данных?
2. При вводе данных в combobox подгружать варианты с напрямую с сервера?
> с учетом того что подгружаемые данные уже кэшированны на сервере;
3. Предварительная загрузка полных списков, и уже в дальнейшем работа с данными списками на прямую на стороне клиента;
> насколько критична нагрузка на память?

Хотелось бы что бы вы поделились принципом работы данной реализации, потому как я не могу остановиться на каком то конкретном варианте и не исключается что в целом пока не имею правильный вариант реализации вообще.

Старый 21.10.2010, 13:08
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 2  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
Зависит от количества вариантов, если их ~15000, заранее они не известны и список динамически изменяются, то очевидно, что нужно подружать с сервера по мере ввода. (про нагрузку на бд спросите у вашего серверника, многое зависит от реализации выборки )

Если вариантов 5, и они постоянные, то не менее очевидно, что лучше их хранить на клиенте, либо подгружать один раз.
__________________
#flasher@irc.trg.ru:6667

Старый 21.10.2010, 13:21
ERrorMAKros вне форума Посмотреть профиль Отправить личное сообщение для ERrorMAKros Посетить домашнюю страницу ERrorMAKros Найти все сообщения от ERrorMAKros
  № 3  
Ответить с цитированием
ERrorMAKros
 
Аватар для ERrorMAKros

Регистрация: May 2008
Адрес: Земля.Украина.Одесса
Сообщений: 219
Отправить сообщение для ERrorMAKros с помощью ICQ Отправить сообщение для ERrorMAKros с помощью Skype™
Одновременных подключений к базе данных может быть до 200 (Firebird SQL database), вариантов данных в списках так же может быть ооочень много (списки городов я взял к примеру). Думаю что нужно для начала организовать надежную систему кеширования на сервере и отдавать результаты или из кеша ...или (если по ключам запроса данных нет в кэше) из базы данных - в кэш и параллельно на сторону клиента.

Пожалуйста поправьте меня если я не прав!

Старый 21.10.2010, 13:23
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 4  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
1. Если нормально сделать, то некритична.
2. По каждому нажатию кнопки отправлять HTTP запрос - плохая идея. Сокет вполне осилит нужную интерактивность (но вообще-то его нужность под вопросом, проблемы с проксями итп.). Может, грузить список после ввода 1-2 символов, лучше сжатый. Однозначно нужен список, вшитый во флешку или загруженный изначально, из городов которого там 90% юзеров будут. Может, грузить что-то только если введённого юзером нет в базовом списке.
3. А сколько у вас городов всего, сколько весит список городов, сколько он весит заархивированный?
А чем текущая реализация-то не устраивает? Тут скорее надо прыгать, а не думать.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 21.10.2010, 13:26
ERrorMAKros вне форума Посмотреть профиль Отправить личное сообщение для ERrorMAKros Посетить домашнюю страницу ERrorMAKros Найти все сообщения от ERrorMAKros
  № 5  
Ответить с цитированием
ERrorMAKros
 
Аватар для ERrorMAKros

Регистрация: May 2008
Адрес: Земля.Украина.Одесса
Сообщений: 219
Отправить сообщение для ERrorMAKros с помощью ICQ Отправить сообщение для ERrorMAKros с помощью Skype™
Список городов - все! )) ...международная система, в том же проекте еще много других очень больших списков. Систему первое время придется "учить", ...списки будут пополнятся! Подстановка значений нужна для того, что бы пользователь максимально быстро находил свой вариант записи, ...что бы не разводили одни и те же слова в нескольких разных интерпретациях (еще и с ошибками).

Старый 21.10.2010, 14:01
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 6  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Ну типа 2 млн. городов, ну пусть 10 млн. - меньше 30 шагов по бинарному дереву, нормальная организация бд или своё дерево и проблем со временем доступа у сервера нет, но загрузить всё нельзя. Я бы таки сделал вариант - 10к городов вшить/грузить (менее 100 кб), если юзер вводит то, чего нет там (что редко (а может вообще никогда, если он не бред пишет), тогда он подождёт ответа сервака).
Максимально быстро и интерактивно - запрос на сервер слать через сокет, если имеющееся не может предложить n (напр 5) вариантов, сервер отдает не более m*n (m напр 6) новых вариантов.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 21.10.2010, 14:21
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 7  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Если списки взаимозависимые (например: страна -> регион -> город), то можно обойтись и простыми HTTP запросами с предзагрузкой на каждом шаге. Количество вариантов на каждом шаге будет на порядок меньше. Если база на все города, то могут быть проблемы с написанием города, как то, различные варианты транслитерации, запись латиницей / кирилицей / национальным алфавитом и т.д.

Старый 21.10.2010, 14:44
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 8  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
Ну кстати говоря -De- прав, поиск по вектору из 100000 строк проходит за ~70 мс. Т.е. можно сразу загрузить большое количество популярных городов (ну скажем с населением больше 500 тыс. человек)


Код теста:
Код AS3:
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;
}
Добавлено через 54 секунды
Цитата:
Сообщение от alatar Посмотреть сообщение
различные варианты транслитерации, запись латиницей / кирилицей / национальным алфавитом и т.д.
utf решает эту проблему
__________________
#flasher@irc.trg.ru:6667


Последний раз редактировалось Obi; 21.10.2010 в 15:09.
Старый 21.10.2010, 15:06
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 9  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
utf решает эту проблему
Я не это имел ввиду. UTF не решает проблему разного написания названия города. Например, для Киева есть два различных написания латиницей, транслитерация с русского и украинского соответсвенно.

Старый 21.10.2010, 16:48
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 10  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Если правильно, то за ~0 мс ищет)
Ну и вообще то, что оно находит и правильное название города - разные штуки, можно, например, в вектор, кроме строки засунуть ссылку на правильный город.
Код AS3:
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, время: 03:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:20.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.