эффективный парсинг

User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Гы
Я тоже FTS написал
Он даже fuzzy search делает
Завтра доложу скоростные характеристики
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

shadow7256 wrote:Поиск фраз - отсуствует.. поиск частичных слов - отсутствует... предикаты - отсутствуют.. Ищет толко целое слово и все.

Хи-хи. Я вам пятьдесят пять багов в этой аппликухе найду и вы поймете, что целые слова она искать тоже не умеет. Начать можно с различных видов пробелов (например 0x200B/0x00A0), с составных немецких слов и прочей фигни. Не забыть про турецкую i, акронимы и устоявшиеся названия вроде С#, C++. Case/accent sensitivity etc.
Увидев друга, Портос вскрикнул от радости...
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Обычный парсинг будет медленновато.
Я когдато делал реплесмент для гигабайтов текста. Работал очень быстро.
Смысл: аллокируем 64К например, где текст,
первые четыре буквы искомой фразы конвертируем то интегер, и лупим через 4 байта - если совпало - высока вероятность что и остальная часть совпадет - маркаем место, дальше сдвигаем на один байт и опять лупим. 4 раза. Потом промаркованные места внимательно с лупой анализируем.

Зависит конечно че надо найти..
Верить нельзя никому - даже себе. Мне - можно!
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

Фигли: не проще было конечный автомат построить? Если скорострельность требуется.
Увидев друга, Портос вскрикнул от радости...
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

8K wrote:Фигли: не проще было конечный автомат построить? Если скорострельность требуется.


А что ето? :pain1:
Верить нельзя никому - даже себе. Мне - можно!
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

A. Fig Lee wrote:
8K wrote:конечный автомат

А что ето? :pain1:

Издеваетесь, да? Проблема текстового поиска (и замены) обсосана во всех возможных аспектах и подробностях, даже в популярных книжках. А уж про конечные автоматы in general так и вообще стыдно не знать, тем более программисту.
Увидев друга, Портос вскрикнул от радости...
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

8K wrote:Издеваетесь, да? Проблема текстового поиска (и замены) обсосана во всех возможных аспектах и подробностях, даже в популярных книжках. А уж про конечные автоматы in general так и вообще стыдно не знать, тем более программисту.


Дык я ж не про стыдно, а про автомат. Может я его знаю, но не знаю, что ето автомат?
Верить нельзя никому - даже себе. Мне - можно!
111001
Posts: 11
Joined: 04 Apr 2004 01:40

Re: эффективный парсинг

Post by 111001 »

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.
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

Еще про один thread забыли, который по мере необходимости будет сдохнувшие/подвисшие ABCD потоки поднимать заново. И прочий housekeeping делать.

Не, я в этом не участвую.
Увидев друга, Портос вскрикнул от радости...
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

A. Fig Lee wrote:про автомат. Может я его знаю, но не знаю, что ето автомат?

Набор состояний и переходов между ними.

Скажем, направленный граф - автомат. А уж если он еще и двудольный...
Увидев друга, Портос вскрикнул от радости...
User avatar
Win32nipuh
Уже с Приветом
Posts: 2489
Joined: 04 Feb 2002 10:01
Location: Слава Україні!

Да...

Post by Win32nipuh »

Почему Вы не упоминаете, что ваш аналитик вводит слово для поиска так, как он думает, а ждет в результатах все словоформы по правилам английского языка? Или не так? Или он должен в точности вводить слово, как он где-то там встречается?
В этом случае поиск LIKE не поможет.

И вопрос: Вы указали конфигурацию сервера. У одного нашего клиента в Америке была почти такая же, были постоянные жалобы и на поиск, и на производительность.
Потом он установил кластер для SQLServer, SCSI RAID, 8 Г памяти, 4 процессора, после этого - тишина.Все работает :-)
111001
Posts: 11
Joined: 04 Apr 2004 01:40

Post by 111001 »

8K wrote:Не, я в этом не участвую.


Не все так страшно. Параллельная обработка последовательности входящих событий - весьма распространенная штука.
shadow7256
Уже с Приветом
Posts: 9402
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: Да...

Post by shadow7256 »

Win32nipuh wrote:Почему Вы не упоминаете, что ваш аналитик вводит слово для поиска так, как он думает, а ждет в результатах все словоформы по правилам английского языка? Или не так? Или он должен в точности вводить слово, как он где-то там встречается?


это зависит от того , что он вводит. Он может строить запросы с использованием предиткатов "Bill AND Bush NOT gay marridge" допустим. Full text search позволяет это делать. Также он может ввести " cut* " и тогда ему вернутся тексты, которые содержат любое слово начинающиеся с букв CUT. Если он просто ввел слово, то вернутся тексты содержащие строго это слово.

И вопрос: Вы указали конфигурацию сервера. У одного нашего клиента в Америке была почти такая же, были постоянные жалобы и на поиск, и на производительность.
Потом он установил кластер для SQLServer, SCSI RAID, 8 Г памяти, 4 процессора, после этого - тишина.Все работает :-)


Вопрос как работает? Он использует full text search? насколько быстро происходит индексация текста и как много текста поступает в секунду?
8K
Уже с Приветом
Posts: 5552
Joined: 20 Mar 2001 10:01
Location: SFBA

Post by 8K »

111001 wrote:
8K wrote:Не, я в этом не участвую.

Не все так страшно. Параллельная обработка последовательности входящих событий - весьма распространенная штука.

Я не боюсь. Напугал доярку сиськой (ц).

Я просто знаю, что это не для чайников задача, поэтому охота искать на свою ж. приключений - пожалуйста, но я тут не советчик.Задача в другой плоскости решается.
Увидев друга, Портос вскрикнул от радости...
shadow7256
Уже с Приветом
Posts: 9402
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Post by shadow7256 »

Если поставим два процессора и разнесем процессы Сиквела и Индексирования по ним, но действительно ли сильно улучшится скорость обработки?

У меня сейчас стоит один процессор и я попробовал выставить affinity либо у сиквельного процесса либо у поиска - система отфутболила меня, сказала не имеешь право это делать.

А для других процессов (не системных) дает выставлять. Кстати процессор один а видит она его как два. Это из за hyperthreading?

Return to “Вопросы и новости IT”