Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с БД с помощью потоков 
:(
    Опции темы
mspuz
Дата 19.12.2005, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Проблема заключается в слишком медленной обработке строки адреса. Мне необходимо взять строку с адресом из таблицы и проанализировав её (процесс анализа активно использует SQL-запросы) вытащить оттуда город, поселок, улицу и номер дома. Вот я и подумал, а если взять строку и передать её в отдельную программу с параметрами, где указать саму строку и рекно в таблице и пойти дальше, а эта программка обработает строку и по данному рекно вставит в таблицу результаты анализа. Если запустить таких потоков штук 10, то я думаю выиграш в скорости будет. Только получается, что придется создавать оконное приложение, т.к. на него придется помещать невизуальные компоненты IBDatabase и IBQuery или DataModule. Как вы считаете стоит запариваться???

PM MAIL   Вверх
SergeBS
Дата 19.12.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Как ни прыгай, если тебе в одно поле загнали весь адрес, то задача разделения на город, улицу и т.п. не автоматизируется. Проверено. Так что ручками приводи в нормальную форму, а потом работай.
PM MAIL   Вверх
Vit
Дата 19.12.2005, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
mspuz
Дата 20.12.2005, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



SergeBS У меня написана программа и разработан алгоритм, который с 99% точности позволяет это сделать.
Vit По моему меня не поняли - не хранить, а обрабатывать каждую запись в отдельном потоке, а не останавливать и ждать когда обработается одна запись
PM MAIL   Вверх
VVSF
Дата 20.12.2005, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



[b]mspuz[/b, тебе надо КАЖДУЮ строку??А если в таблице 100 записей, то и 100 потоков??
Или пользователь кликнул по кнопке, в которой обработчик конкретной строки - и приложение при этом не лочится процессом обработки..это скорее всего..Так? Тогда стоит. Знаю гле подобная тема уже поднималась.
PM MAIL   Вверх
mspuz
Дата 20.12.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



VVSF У меня будет ограниченное количество потоков (задается пользователем). Прога считывает адрес из таблицы и создает отдельный поток, затем следующую и т.д., пока количество созданных потоков не будет равно предельному значению. Но если один из потоков уже закончил свою работу, то запускается следующий, т.е. программа все время отслеживает количество потоков перед тем, как создать новый.
PM MAIL   Вверх
VVSF
Дата 20.12.2005, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Тогда однозначно - стоит.
тем более что это не будет блокировать программу и запросы пройдут незаметно для пользователя...
Добавлено @ 19:15
кстати, можно обойтись и без лишнего окна - создавай динамически все обьекты.. так даже лучше.. smile
PM MAIL   Вверх
mspuz
Дата 22.12.2005, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Все сделал, наконец-то все заработало, но столкнулся со следующей проблемой - если указываю количесво потоков более 15 вываливается сообщение "Удаленный хост отверг запрос на подключение" и все процессы повисают. Один раз пропустило 100 потоков!!! но потом снова повисло. Корректно работает лишь с 10, но прирост по скорости более чем в 2 раза!!! Так в чем сдесь проблема - сервер не выдерживает??? По моим данным сервер допускает подключение 500 пользоваелей в сети все время около 100, а мне не разрешает даже 20!!! Объясните пожалуйста.
PM MAIL   Вверх
Vit
Дата 22.12.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
mspuz
Дата 23.12.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Vit А если на ламерском языке smile
PM MAIL   Вверх
mspuz
Дата 23.12.2005, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



Да и кстати я не использую транзакции (в явном виде, в неявном то они все равно есть) и все SQL-запросы направленны лишь на выборки и никаких изменений в таблицы я не заношу.
PM MAIL   Вверх
AntonSaburov
Дата 23.12.2005, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 118



Например MS SQL при SELECT делает блокировку на таблицу (может сейчас не так - я не смотрел последние версии). Надо было использовать NOLOCK.
PM MAIL WWW ICQ   Вверх
SergeBS
Дата 23.12.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



mspuz
Цитата

У меня написана программа и разработан алгоритм, который с 99% точности позволяет это сделать.

smile Остается ВСЕ проверить и исправить оставшийся 1%. Это я и называю работать ручками. А уже после этого забыть про старую дурную структуру и работать нормально.
Да, а база случайно не по 475 постановлению?
PM MAIL   Вверх
mspuz
Дата 23.12.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 20.6.2005
Где: Ногинск

Репутация: нет
Всего: нет



SergeBS Да с чувством юмора у тя нехило smile . Но без шуток - я работаю в информационно-почтовой фирме и разбивка адреса здесь значит очень многое, так что программа работает и проверить 1% довольно просто и быстро, так что ручки особо здесь не мараем smile
PM MAIL   Вверх
Vit
Дата 23.12.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.