On-line: гостей 4. Всего: 4 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 2517
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.12.12 14:01. Заголовок: Как сделать многопотоковую проверку Базы ?


Есть ряд задач (переодически возникающих) на которые тратиться много времени.
Может быть я и не прав.

Вот например:
база 20 тыс.записей, каждую запись нужно пройти и проверить заполнение полей, если не заполнено - ошибку в тхт-файл.

Все (наверно) делают последовательную обработку, т.е. проверяем базу с 1 по N-запись..
А можно же через потоки сделать ?

Подскажите как примерно это можно сделать для хХарбора ?
Заранее спасибо..




Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 78 , стр: 1 2 3 4 All [только новые]


moderator


Пост N: 548
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 06.02.13 10:49. Заголовок: А в чем, собственно,..


А в чем, собственно, проблема ? Запускаем поток, открываем в нем базу и проверяем, примерно так:

 цитата:
...
hb_threadDetach( hb_threadStart( @TestBase() ) )
...
Function TestBase()
use mybase shared new
do while !Eof()
if ...
...
endif
skip
enddo
Return Nil



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2630
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.02.13 12:32. Заголовок: alkresin пишет: А в..


alkresin пишет:

 цитата:
А в чем, собственно, проблема ?



То что вы мне предлагаете, это ОПЯТЬ ПОСЛЕДОВАТЕЛЬНАЯ проверка базы, только в фоновом потоке.
Правильно ?

А я хочу МНОГОПОТОЧНУЮ проверку базы... Может я неправильно выражаюсь, тогда извините меня.
Я хочу чтобы ну допустим 30-40 потоков проверили базу, причем каждый поток проверял свои записи, а уже проверенные не трогал...
Т.е. количество записей делим на количество потоков и каждый поток проверяет СВОИ записи.
Вот примерно так хочу ускорить проверку....
Как такое можно реализовать ?
Будет ли выигрыш по времени ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 32
Зарегистрирован: 07.06.08
ссылка на сообщение  Отправлено: 06.02.13 12:37. Заголовок: Обработку записей ба..


Обработку записей базы я делаю через dbeval(), работает в десятки раз быстрее. А перебирать по записи, по моему, нерационально.

Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 549
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 06.02.13 12:59. Заголовок: Andrey пишет: Я хоч..


Andrey пишет:

 цитата:
Я хочу чтобы ну допустим 30-40 потоков проверили базу, причем каждый поток проверял свои записи, а уже проверенные не трогал...


Ну тогда вот так:

 цитата:
...
hb_threadDetach( hb_threadStart( @TestBase() ),1,5000 )
hb_threadDetach( hb_threadStart( @TestBase() ),5001,10000 )
hb_threadDetach( hb_threadStart( @TestBase() ),10001,15000 )
hb_threadDetach( hb_threadStart( @TestBase() ),15001,20000 )
...
Function TestBase( nRec1, nRec2 )
use mybase shared new
go to nrec1
do while !Eof() .and. Recno()<=nRec2
if ...
...
endif
skip
enddo
Return Nil


Если будете результаты писать в один текстовый файл, то операцию записи надо mutex'ом синхронизировать ( hb_mutexLock() ... hb_mutexUnLock() )

 цитата:
Будет ли выигрыш по времени ?


Может быть :).
a_sidorov пишет:

 цитата:
Обработку записей базы я делаю через dbeval(), работает в десятки раз быстрее


Ну это вы загнули... На локальной БД небольшой выигрыш во времени может иметь место, а в сети разница будет неощутима - временные затраты на операции перемещения по базе и чтения данных существенно выше, чем обработка нескольких строк кода.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2631
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.02.13 14:37. Заголовок: alkresin пишет: Есл..


alkresin пишет:

 цитата:
Если будете результаты писать в один текстовый файл, то операцию записи надо mutex'ом синхронизировать ( hb_mutexLock() ... hb_mutexUnLock() )



А можно чуть подробнее....
Допустим:
Function Main()
.....
cErrorFile := "myerror.log"
.....
hb_threadDetach( hb_threadStart( @TestBase() ),1,5000, cErrorFile)
hb_threadDetach( hb_threadStart( @TestBase() ),5001,10000, cErrorFile )
hb_threadDetach( hb_threadStart( @TestBase() ),10001,15000, cErrorFile )
hb_threadDetach( hb_threadStart( @TestBase() ),15001,20000, cErrorFile )
...
Function TestBase( nRec1, nRec2, cErrorFile )
LOCAL cError:=""
use mybase shared new
go to nrec1
do while !Eof() .and. Recno()<=nRec2
if ...
...
// если ошибка, то добавляем в строку сError += "Error ...."+CRLF
endif
skip
enddo
// --- здесь будет запись в cErrorFile... строки cError !
// Как сделать ?
Return Nil


Спасибо: 0 
ПрофильЦитата Ответить
moderator


Пост N: 550
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 06.02.13 14:55. Заголовок: Где-то в начале прог..


Где-то в начале программы:

static mutex1

Затем, перед запуском потоков:

mutex1 := hb_mutexCreate()

Ну и в TestBase():

hb_mutexLock( mutex1 )
// --- здесь будет запись в cErrorFile... строки cError !
hb_mutexUnLock( mutex1 )



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2632
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.02.13 14:59. Заголовок: СПАСИБО БОЛЬШОЕ ! :..


СПАСИБО БОЛЬШОЕ !
Буду пробовать...


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2616
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.02.13 15:06. Заголовок: Andrey пишет: Буду ..


Andrey пишет:

 цитата:
Буду пробовать...


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2633
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.02.13 19:11. Заголовок: Dima пишет: Поведай..


Dima пишет:

 цитата:
Поведай нам потом есть ли выигрыш по скорости.


Обязательно !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2634
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.02.13 14:45. Заголовок: alkresin пишет на ht..


alkresin пишет на http://kresin.belgorod.su/rus/hrbfaq.html#Doc11:

 цитата:
Другие примеры многопоточных программ вы можете найти в harbour/tests/mt.


А для хХарбора где можно найти функции и примеры ?
Я пока на хХарборе сижу....

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 713
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 08.02.13 15:34. Заголовок: Andrey пишет: А для..


Andrey пишет:

 цитата:
А для хХарбора где можно найти функции и примеры ?

в папке tests/mt*.prg

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2642
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.02.13 00:54. Заголовок: Сделал пока однопото..


Сделал пока однопотоковый тест проверки базы и понял где "тормоза" можно убрать.

При проверке базы, если ошибка, то я использую CT-функцию:
STRFILE( "Ошибка ... такая то...", cFileError, .T.)
Да еще и в цикле проверки. Если её убрать, то проверка просто "влет" ускоряется....
Может ошибки писать в массив, а потом сбрасывать на диск ?
Нужно ли заменить STRFILE() и чем ?

Народ, подскажите как вы создаете текстовые журналы-ошибок для пользователя ?



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 826
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 10.02.13 09:32. Заголовок: Вот как раз отдельны..


Вот как раз отдельный поток мог бы делать журналирование, имхо.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2645
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.02.13 14:33. Заголовок: Народ, помогите прот..


Народ, помогите протестировать мою тестовую программу.
А потом пришлите log-файл теста: dBase2test.log
У меня комп слишком шустрый для таких тестов... Скрытый текст

Это тест на 30000 записей, можно поставить и 70000 (есть такие клиенты).
Конечно же реально кол-во ошибок в журналах меньше чем сейчас создается в тесте...

Исходник и сама программа здесь - http://files.mail.ru/5A8E598290604D31955459BEFBDF3FD3
Какие будут рекомендации для ускорения работы этой программы для ОДНОПОТОКОВОЙ работы для локальной программы ?
Для сетевой задачи журнал-ошибок нужно наверно все таки писать на локальную станцию...


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 79
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 10.02.13 22:14. Заголовок: Для сетевой работы ж..


Для сетевой работы журнал лучше писать в dbf файл ИМХО конечно. А если в DBF завести последнее поле длиной 2 символа и туда писать chr(13)+ chr(10) и отформатировать выводимую запись, то такую БД можно будет просматривать любым редактором. За исключением абракадабры в заголовке DBFинфорация будет вполне читаема и без специальных программ типа DBU

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2647
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.02.13 00:06. Заголовок: nick_mi пишет: За и..


nick_mi пишет:

 цитата:
За исключением абракадабры в заголовке DBFинфорация будет вполне читаема и без специальных программ типа DBU


Это пользователь будет читать ? Как ты ему это объяснишь ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 80
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 11.02.13 09:17. Заголовок: Ну если вопрос стоит..


Ну если вопрос стоит о том, чтобы смотрел пользователь, значит для него простенькую программу просмотра, а если
уж очень влом писать программу просмотра или журнал вообще предназначен в первую очередь тебе для разборок полетов, в первую запись базы вносишь данные
CHR(13) + CHR(10) + "***ЖУРНАЛ РАБОТЫ***" + CHR(13) + CHR(10) .
А пользователю объясняешь:
Все что до того - служебная информация, а ниже того - для пользовательского внимания

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 117
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.02.13 10:27. Заголовок: Andrey пишет:Какие б..


Andrey пишет:
 цитата:
Какие будут рекомендации


Может вот так Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2648
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.02.13 12:56. Заголовок: Да вопрос то по друг..


Да вопрос то по другому стоит:
Какие будут рекомендации для ускорения работы этой программы для ОДНОПОТОКОВОЙ работы для локальной программы ?

В чем разница по скорости записи:
1) CT-функции STRFILE()
2) Или то что предлагает nick_mi nick_mi пишет:

 цитата:
Для сетевой работы журнал лучше писать в dbf файл ИМХО конечно.




Запись в DBF это 2 операции: APPEND BLANK и запись в поле
STRFILE() наверно 4... (Я не знаток) открыть файл, указатель файла в конец файла, запись в файл, закрыть файл.
Самые МЕДЛЕННЫЕ операции - это: открытие и закрытие файлов...
Но тогда я сам могу создать функцию записи в журнал. Один раз его открыть в начале, потом писать в него (2 операции, указатель в конец файла и запись строки) и в конце проверки - закрыть файл.
Будет наверно быстрее....

Народ, помогите протестировать мою тестовую программу. Ссылка вверху !

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 81
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 11.02.13 13:07. Заголовок: An example of measu..


An example of measuring the speed of processing database for [x]Harbour
Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> Russia, Dmitrov
---------------------------------------------------------------------------
CPU: Intel(R) Pentium(R) CPU G645 @ 2.90GHz [~2894 MHz]
Free RAM: 1 298 096
OS: Windows XP Professional 5.01.2600 Service Pack 3
Development: xHarbour build 1.0.0 Intl. (SimpLex) - Borland C++ 5.5.1
Multi Thread: No
---------------------------------------------------------------------------
Create/Open Test.dbf - 00 hour 00 minute 03 seconds ( Recno: 30000 )
First test base - 00 hour 00 minute 02 seconds
Second test base - 00 hour 00 minute 05 seconds
Third test base - 00 hour 00 minute 02 seconds
Fourth test base - 00 hour 00 minute 08 seconds

The total test time ---> 00 hour 00 minute 21 seconds


Спасибо: 1 
ПрофильЦитата Ответить
Ответов - 78 , стр: 1 2 3 4 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 43
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет