Контекстный поиск в Browse

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Контекстный поиск в Browse

Сообщение Игорь Столяров »

Привет всем !

Есть некий большой неиндексированный список (TPS),
и нужно выполнять в нем контекстный поиск по символьным строкам .... :(
Сделал, что называется "тупо в лоб", т.е. в поле фильтр добавил:

Код: Выделить всё

Loc:TextFind Cstring(20)
....
InString(Loc:TextFind,Upper(Clip(Bas:Field01)),1)
Все работает. Но мееееедленно. Особенно в сети. :)
Может быть есть идеи по альтернативному варианту контекстного поиска в Browse ?
Заранее спасибо за идею. :)
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4986
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 21 раз

Контекстный поиск в Browse

Сообщение kreator »

А закачать всё в броуз и искать по очереди? Т.е. тут альтернатива - либо ждать загрузки броуза, либо ждать при фильтрации. А сколько записей примерно нужно просмотреть?
We are hard at work… for you. :)
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3135
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Контекстный поиск в Browse

Сообщение Дед Пахом »

Или IMDD.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Контекстный поиск в Browse

Сообщение Игорь Столяров »

Записей порядка 100т., но они "толстые" (большой размер Record) ... и кроме поиска их надо редактировать.
Разводить байду с загрузкой в IMDD и потом синхронизировать базу на диске не очень охота, если честно. ;)
Тем более при работе в сети с общей БД.

Здесь скорее вопрос в том, можно ли как-то эффективней выполнять поиск подстроки в строке, чем с Instring() ?
Я помню, где-то раньше встречался самописный аналог Instring(), и там как раз отмечалось, что он намного быстрей ...

И еще. Я это как раз сейчас пытаюсь понять ... Предположим есть Record из 10 символьных полей.
Быстрей искать одной командой Instring() по всему Record или все-таки отдельно по полям ....
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3135
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Контекстный поиск в Browse

Сообщение Дед Пахом »

Посмотри сишные memcmp, memchr. StringTheory их использует в своей реализации INSTRING.
С уважением, ДП
kreator
✯ Ветеран ✯
Сообщения: 4986
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 7 раз
Поблагодарили: 21 раз

Контекстный поиск в Browse

Сообщение kreator »

Игорь Столяров писал(а):И еще. Я это как раз сейчас пытаюсь понять ... Предположим есть Record из 10 символьных полей.
Быстрей искать одной командой Instring() по всему Record или все-таки отдельно по полям ....
Их же как-то ещё соединить надо, типа на это время тоже тратиться.
Тоже в голове лежит, что можно эффективнее организовать поиск. Может воспользоваться функцией Match?
Совсем тупо - в фоне загрузить в очередь. Но это опять синхронизацию нужно прорабатывать.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Контекстный поиск в Browse

Сообщение Игорь Столяров »

kreator писал(а): функцией Match
Я как-то давно пробовал, Match() очень медленно работает, у нее ведь очень мощный аналитический функционал ...
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Контекстный поиск в Browse

Сообщение Игорь Столяров »

Дед Пахом писал(а): StringTheory их использует в своей реализации INSTRING
Спасибо за наводку, но нет. В CapeSoft StringTheory обычная шара, просто надстойка над "стандартной" Instring()

Код: Выделить всё

StringTheory.Instring Procedure(string pSearchValue, long pStep=1, long pStart=1, long pEnd=0, long pNoCase=0)!,long
x           long, auto
  code
    if self.value &= null
        return 0
    end
    x = InString(Choose(pNoCase, Upper(pSearchValue), pSearchValue), Choose(pNoCase, Upper(self.value), self.value), pStep, pStart)    
    if pEnd and x + Len(pSearchValue) - 1> pEnd        
        x = 0
    end
    return x
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3135
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Контекстный поиск в Browse

Сообщение Дед Пахом »

ну значит моя StringTheory слегка поновее :-)
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Контекстный поиск в Browse

Сообщение Игорь Столяров »

Открой тайну нового кода !
Я всю творческую жизнь мечтаю увидеть хоть что-то разумное made in CapeSoft ! :idied:
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Контекстный поиск в Browse

Сообщение Yufil »

Хммм. У меня лёгкое подозрение, переходящее в абсолютную уверенность, что чтение записи базы данных значительно медленнее, чем поиск по Instring. Кстати, надо посмотреть, как там сделано. Возможно, что там просто обращение к сишной функции - и ничего больше.

Методы быстрого поиска в строке действительно есть https://ru.wikipedia.org/wiki/%D0%90%D0 ... 1%80%D0%B0, но это не наш случай, поскольку чтение записи базы данных ... см.выше

А нельзя как-то apache solr присобачить?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Контекстный поиск в Browse

Сообщение Игорь Столяров »

Прикольно. В моей версии (с FTP) CapeSoft StringTheory есть реализация поиска алгоритмом Бойера — Мура,
только она закомментирована, видимо тогда была на стадии отладки. Только вот вполне может оказаться,
что и стандартная InString() сделан по тому же алгоритму ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1378
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Контекстный поиск в Browse

Сообщение RaFaeL »

У нас MS SQL и самописный броуз, в котором контекстный поиск встраивается непосредственно в запрос на сервер. Все остальное кмк быстро работать не будет...
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7384
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 14 раз
Поблагодарили: 49 раз

Контекстный поиск в Browse

Сообщение Игорь Столяров »

Написал небольшой тестик с фильтрацией списка по 5 символьным полям.
По его результатам процентов 20-30% времени сжирается именно внутри комбинации "Instring(FindStr,Upper(Field),1)" :(
Т.е. есть смысл, попробовать, что-то другое ...

Если кто-то является счастливым обладателем современной версии CapeSoft StringTheory - дайте пожалуйста
код StringTheory.Instring (он в файле StringTheory.clw). Спасибо !
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Контекстный поиск в Browse

Сообщение Yufil »

Года четыре назад сталкивался с проблемой ну очень медленного Browse в MS SQL с нехилыми фильтром поиска по десятку таблиц и полсотне полей, потому что логика кларионовского browse требует заново выполнять запрос, когда подгружается запись за пределами browse. То есть ткнули стрелку вниз - запрос к серверну с нехилым фильтром, ткнули ещё-опять запрос, и каждый раз минута-другая ожидания одной записи. Если указать режим 'File' - ждём минут 10-15, пока результат запроса перегрузится в память. Правда, вопросов о добавлении -удалении записей в эту Browse не стояло. И это таблица с которой работают постоянно!

Вынужден был создать временную таблицу, состоящую только из ключа основной записи, а потом сделал Browse именно по временной таблице с подгрузкой полей при показе - всё стало выглядеть вполне прилично по времени. Но это не о том...
Ответить