эффективный парсинг
-
- Уже с Приветом
- Posts: 28294
- Joined: 29 Aug 2000 09:01
- Location: SPB --> Gloucester, MA, US --> SPB --> Paris
-
- Уже с Приветом
- Posts: 5552
- Joined: 20 Mar 2001 10:01
- Location: SFBA
shadow7256 wrote:Поиск фраз - отсуствует.. поиск частичных слов - отсутствует... предикаты - отсутствуют.. Ищет толко целое слово и все.
Хи-хи. Я вам пятьдесят пять багов в этой аппликухе найду и вы поймете, что целые слова она искать тоже не умеет. Начать можно с различных видов пробелов (например 0x200B/0x00A0), с составных немецких слов и прочей фигни. Не забыть про турецкую i, акронимы и устоявшиеся названия вроде С#, C++. Case/accent sensitivity etc.
Увидев друга, Портос вскрикнул от радости...
-
- Уже с Приветом
- Posts: 12072
- Joined: 17 Nov 2002 03:41
- Location: английская колония
Обычный парсинг будет медленновато.
Я когдато делал реплесмент для гигабайтов текста. Работал очень быстро.
Смысл: аллокируем 64К например, где текст,
первые четыре буквы искомой фразы конвертируем то интегер, и лупим через 4 байта - если совпало - высока вероятность что и остальная часть совпадет - маркаем место, дальше сдвигаем на один байт и опять лупим. 4 раза. Потом промаркованные места внимательно с лупой анализируем.
Зависит конечно че надо найти..
Я когдато делал реплесмент для гигабайтов текста. Работал очень быстро.
Смысл: аллокируем 64К например, где текст,
первые четыре буквы искомой фразы конвертируем то интегер, и лупим через 4 байта - если совпало - высока вероятность что и остальная часть совпадет - маркаем место, дальше сдвигаем на один байт и опять лупим. 4 раза. Потом промаркованные места внимательно с лупой анализируем.
Зависит конечно че надо найти..
Верить нельзя никому - даже себе. Мне - можно!
-
- Уже с Приветом
- Posts: 5552
- Joined: 20 Mar 2001 10:01
- Location: SFBA
-
- Уже с Приветом
- Posts: 12072
- Joined: 17 Nov 2002 03:41
- Location: английская колония
-
- Уже с Приветом
- Posts: 5552
- Joined: 20 Mar 2001 10:01
- Location: SFBA
A. Fig Lee wrote:8K wrote:конечный автомат
А что ето?
Издеваетесь, да? Проблема текстового поиска (и замены) обсосана во всех возможных аспектах и подробностях, даже в популярных книжках. А уж про конечные автоматы in general так и вообще стыдно не знать, тем более программисту.
Увидев друга, Портос вскрикнул от радости...
-
- Уже с Приветом
- Posts: 12072
- Joined: 17 Nov 2002 03:41
- Location: английская колония
8K wrote:Издеваетесь, да? Проблема текстового поиска (и замены) обсосана во всех возможных аспектах и подробностях, даже в популярных книжках. А уж про конечные автоматы in general так и вообще стыдно не знать, тем более программисту.
Дык я ж не про стыдно, а про автомат. Может я его знаю, но не знаю, что ето автомат?
Верить нельзя никому - даже себе. Мне - можно!
-
- Posts: 11
- Joined: 04 Apr 2004 01:40
Re: эффективный парсинг
shadow7256 wrote:Каким наиболее эффективно сделать следующее...
Процесс (назовем его процесс А) получает текстовую информацию. Блоками. Каждый блок имеет уникальный ID плюс непосредственно само тело, содержащее информацию. Информация сохраняется в базе данных.
Нужно : Отпарсить каждый блок по словам и запомнить вхождение каждого слова в блок. Это нужно для последующего поиска слов. Грубо говоря допустим создать multimap, Ключ - слово, значение - индекс блока, в котором слово найдено.
Что пришло на ум навскидку...
1. Создать отдельный поток, которому передавать индекс каждого нового блока и само тело. Поток отпарсит тело и сохранит результаты в каком нибудь мультимапе. Сразу возникает вопрос, а не получится ли так, что пока рабочий поток парсит тело, то произойдет переключение проца на основной поток и оставшаяся неотпарсенная информация потеряется?
...
Чтобы ничего не терялось в варианте 1, можно, например, сделать так:
Thread A:
- получает входной блок (сам он не меняется всю дорогу),
делает к нему thread-safe reference counted handle,
запихивает копии хэндлов в очереди подписчиков
(подписчиками здесь будут threads B and C).
Очереди синхронизированы mutex-ом и в них, повторюсь,
лежат не сами блоки, а refcounted handles на них)
Thread B:
- имеет на входе свою очередь из хэндлов на поступающие блоки. Занимается построением того самого multimap.
Обработав блок - уничтожает свой хэндл на блок
Thread C:
- как B, читает из своей входной FIFO очереди хэндлы,
и запихивает в SQL базу соотв блоки с обработкой, убивает хэндл
Thread(s) D ( user thread(s) )
- ищет слово в multimap-е, и если надо - в самой базе. "Multimap" должен быть синхронизирован - есть писатель и "удалятель", pardon, и это узкое место.
Еще надо будет очищать "multimap" (thread C или dedicated thread)
Вместо threads можно использовать процессы и shared memory / in-memory database чтобы делать "multimap", очереди и временно хранить блоки, пока их обрабатывают
параллельно B и C.
-
- Уже с Приветом
- Posts: 5552
- Joined: 20 Mar 2001 10:01
- Location: SFBA
-
- Уже с Приветом
- Posts: 5552
- Joined: 20 Mar 2001 10:01
- Location: SFBA
-
- Уже с Приветом
- Posts: 2489
- Joined: 04 Feb 2002 10:01
- Location: Слава Україні!
Да...
Почему Вы не упоминаете, что ваш аналитик вводит слово для поиска так, как он думает, а ждет в результатах все словоформы по правилам английского языка? Или не так? Или он должен в точности вводить слово, как он где-то там встречается?
В этом случае поиск LIKE не поможет.
И вопрос: Вы указали конфигурацию сервера. У одного нашего клиента в Америке была почти такая же, были постоянные жалобы и на поиск, и на производительность.
Потом он установил кластер для SQLServer, SCSI RAID, 8 Г памяти, 4 процессора, после этого - тишина.Все работает![Smile :-)](./images/smilies/icon_smile.gif)
В этом случае поиск LIKE не поможет.
И вопрос: Вы указали конфигурацию сервера. У одного нашего клиента в Америке была почти такая же, были постоянные жалобы и на поиск, и на производительность.
Потом он установил кластер для SQLServer, SCSI RAID, 8 Г памяти, 4 процессора, после этого - тишина.Все работает
![Smile :-)](./images/smilies/icon_smile.gif)
-
- Posts: 11
- Joined: 04 Apr 2004 01:40
-
- Уже с Приветом
- Posts: 9402
- Joined: 18 Mar 2004 15:11
- Location: New York -> FL
Re: Да...
Win32nipuh wrote:Почему Вы не упоминаете, что ваш аналитик вводит слово для поиска так, как он думает, а ждет в результатах все словоформы по правилам английского языка? Или не так? Или он должен в точности вводить слово, как он где-то там встречается?
это зависит от того , что он вводит. Он может строить запросы с использованием предиткатов "Bill AND Bush NOT gay marridge" допустим. Full text search позволяет это делать. Также он может ввести " cut* " и тогда ему вернутся тексты, которые содержат любое слово начинающиеся с букв CUT. Если он просто ввел слово, то вернутся тексты содержащие строго это слово.
И вопрос: Вы указали конфигурацию сервера. У одного нашего клиента в Америке была почти такая же, были постоянные жалобы и на поиск, и на производительность.
Потом он установил кластер для SQLServer, SCSI RAID, 8 Г памяти, 4 процессора, после этого - тишина.Все работает
Вопрос как работает? Он использует full text search? насколько быстро происходит индексация текста и как много текста поступает в секунду?
-
- Уже с Приветом
- Posts: 5552
- Joined: 20 Mar 2001 10:01
- Location: SFBA
111001 wrote:8K wrote:Не, я в этом не участвую.
Не все так страшно. Параллельная обработка последовательности входящих событий - весьма распространенная штука.
Я не боюсь. Напугал доярку сиськой (ц).
Я просто знаю, что это не для чайников задача, поэтому охота искать на свою ж. приключений - пожалуйста, но я тут не советчик.Задача в другой плоскости решается.
Увидев друга, Портос вскрикнул от радости...
-
- Уже с Приветом
- Posts: 9402
- Joined: 18 Mar 2004 15:11
- Location: New York -> FL
Если поставим два процессора и разнесем процессы Сиквела и Индексирования по ним, но действительно ли сильно улучшится скорость обработки?
У меня сейчас стоит один процессор и я попробовал выставить affinity либо у сиквельного процесса либо у поиска - система отфутболила меня, сказала не имеешь право это делать.
А для других процессов (не системных) дает выставлять. Кстати процессор один а видит она его как два. Это из за hyperthreading?
У меня сейчас стоит один процессор и я попробовал выставить affinity либо у сиквельного процесса либо у поиска - система отфутболила меня, сказала не имеешь право это делать.
А для других процессов (не системных) дает выставлять. Кстати процессор один а видит она его как два. Это из за hyperthreading?