![]() |
|
|
![]()
|
|
| mspuz |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 20.6.2005 Где: Ногинск Репутация: нет Всего: нет |
Проблема заключается в слишком медленной обработке строки адреса. Мне необходимо взять строку с адресом из таблицы и проанализировав её (процесс анализа активно использует SQL-запросы) вытащить оттуда город, поселок, улицу и номер дома. Вот я и подумал, а если взять строку и передать её в отдельную программу с параметрами, где указать саму строку и рекно в таблице и пойти дальше, а эта программка обработает строку и по данному рекно вставит в таблицу результаты анализа. Если запустить таких потоков штук 10, то я думаю выиграш в скорости будет. Только получается, что придется создавать оконное приложение, т.к. на него придется помещать невизуальные компоненты IBDatabase и IBQuery или DataModule. Как вы считаете стоит запариваться???
|
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Как ни прыгай, если тебе в одно поле загнали весь адрес, то задача разделения на город, улицу и т.п. не автоматизируется. Проверено. Так что ручками приводи в нормальную форму, а потом работай.
|
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Хранить в правильном/проанализированном виде... Потоки не помогут
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| mspuz |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 20.6.2005 Где: Ногинск Репутация: нет Всего: нет |
SergeBS У меня написана программа и разработан алгоритм, который с 99% точности позволяет это сделать.
Vit По моему меня не поняли - не хранить, а обрабатывать каждую запись в отдельном потоке, а не останавливать и ждать когда обработается одна запись |
|||
|
||||
| VVSF |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.11.2005 Репутация: нет Всего: нет |
[b]mspuz[/b, тебе надо КАЖДУЮ строку??А если в таблице 100 записей, то и 100 потоков??
Или пользователь кликнул по кнопке, в которой обработчик конкретной строки - и приложение при этом не лочится процессом обработки..это скорее всего..Так? Тогда стоит. Знаю гле подобная тема уже поднималась. |
|||
|
||||
| mspuz |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 20.6.2005 Где: Ногинск Репутация: нет Всего: нет |
VVSF У меня будет ограниченное количество потоков (задается пользователем). Прога считывает адрес из таблицы и создает отдельный поток, затем следующую и т.д., пока количество созданных потоков не будет равно предельному значению. Но если один из потоков уже закончил свою работу, то запускается следующий, т.е. программа все время отслеживает количество потоков перед тем, как создать новый.
|
|||
|
||||
| VVSF |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.11.2005 Репутация: нет Всего: нет |
Тогда однозначно - стоит.
тем более что это не будет блокировать программу и запросы пройдут незаметно для пользователя... Добавлено @ 19:15 кстати, можно обойтись и без лишнего окна - создавай динамически все обьекты.. так даже лучше.. |
|||
|
||||
| mspuz |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 20.6.2005 Где: Ногинск Репутация: нет Всего: нет |
Все сделал, наконец-то все заработало, но столкнулся со следующей проблемой - если указываю количесво потоков более 15 вываливается сообщение "Удаленный хост отверг запрос на подключение" и все процессы повисают. Один раз пропустило 100 потоков!!! но потом снова повисло. Корректно работает лишь с 10, но прирост по скорости более чем в 2 раза!!! Так в чем сдесь проблема - сервер не выдерживает??? По моим данным сервер допускает подключение 500 пользоваелей в сети все время около 100, а мне не разрешает даже 20!!! Объясните пожалуйста.
|
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
Угу... ответил же - потоки не помогут... Дело в блокировках, происходит их эскалация... и в общем транзакции начинают ждать друг друга. Копать надо в направлении реорганизации структуры, чтобы избежать построчного прохода таблицы
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| mspuz |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 20.6.2005 Где: Ногинск Репутация: нет Всего: нет |
Vit А если на ламерском языке
|
|||
|
||||
| mspuz |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 20.6.2005 Где: Ногинск Репутация: нет Всего: нет |
Да и кстати я не использую транзакции (в явном виде, в неявном то они все равно есть) и все SQL-запросы направленны лишь на выборки и никаких изменений в таблицы я не заношу.
|
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Например MS SQL при SELECT делает блокировку на таблицу (может сейчас не так - я не смотрел последние версии). Надо было использовать NOLOCK.
|
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
mspuz
Да, а база случайно не по 475 постановлению? |
|||
|
||||
| mspuz |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 20.6.2005 Где: Ногинск Репутация: нет Всего: нет |
SergeBS Да с чувством юмора у тя нехило
|
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 14 Всего: 207 |
На русском языке? Отвечаю - есть 2 механизма поиска данных (грубо говоря) - один когда ты заставляешь сервер:
1. Прочитать строку 2. Проверить её на какое-то условие 3. В зависимости от проверки "пометить" как необходимую 4. Перейти к следующей Это самый долгий и самый ресурсоёмкий способ поиска. Этот поиск похож на поиск слова в книге путём перелистывая и прочитывая страницу за страницей. К тому же проверяя одну запись сервер блокирует её или её и несколько рядом стоящих на изменение другими процессами, и другие процессы ждут окончания проверки в данном куске таблицы. Если же другой процесс работает над этим куском то твой поиск ждёт. Есть другой способ - поля заранее проиндексированы, и сервер ищет запись по индексу, не читая саму таблицу. Это похоже на поиск по алфавитному указателю в книге. Но так же как и в книге нельзя найти по алфавитному указателю страницу на которой в первом абзаце есть слово "мама" а во втором абзаце есть слово "папа" - в данном случае сколь полным бы не был указатель - всё равно прийдётся просматривать всю книгу вручную. Итого - ваша задача в том виде в котором она сформулирована заставляет сервер просматривать таблицу строка за строкой - и это медленно, очень медленно. Многопоточность в данном случае просто загрузитт сильнее сервер, заставит его тратить на порядок больше памяти, но приведёт лишь к небольшому увеличению производительности. Наиболее корректное решение поставленной задачи - преобразовать таблицу чтобы поиск осуществлялся по полю целиком, т.е. хранить адрес в таблице уже в разобранном состоянии и проиндексированными, а процесс внесения новых данных в таблицу должен включать разбор адреса на составляющие. Т.е. анализ адреса должен осуществлятся не на этапе поиска, а на этапе его занесения в таблицу. Кроме того, надо установить соответствующий уровень блокировок (как их поставить - зависит от сервера) -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| SergeBS |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1111 Регистрация: 10.6.2005 Где: Владимир Репутация: 11 Всего: 22 |
Vit
Нас уже двое с одним рецептом mspuz При чем здесь юмор?. Мне как раз перед отпуском подкинули работу по этому постановлению, так ушел на 2 недели позже :-(. А там как раз столичные "спецы" весь почтовый адрес в одно поле требуют класть. Ну я положил. Пусть им будет хуже |
|||
|
||||
| mspuz |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 20.6.2005 Где: Ногинск Репутация: нет Всего: нет |
Vit ОГРОМНОЕ СПАСИБО!!!!!!!!!!
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |