Форум » [x]Harbour » Как сделать многопотоковую проверку Базы ? » Ответить

Как сделать многопотоковую проверку Базы ?

Andrey: Есть ряд задач (переодически возникающих) на которые тратиться много времени. Может быть я и не прав. Вот например: база 20 тыс.записей, каждую запись нужно пройти и проверить заполнение полей, если не заполнено - ошибку в тхт-файл. Все (наверно) делают последовательную обработку, т.е. проверяем базу с 1 по N-запись.. А можно же через потоки сделать ? Подскажите как примерно это можно сделать для хХарбора ? Заранее спасибо..

Ответов - 78, стр: 1 2 3 4 All

SergKis: An example of measuring the speed of processing database for [x]Harbour Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> Russia, Dmitrov --------------------------------------------------------------------------- CPU: Genuine Intel(R) CPU T2130@ 1.86GHz [~1867 MHz] Free RAM: 1 387 068 OS: Windows Windows Vista Home Edition 6.01.7601 Service Pack 1 Development: xHarbour build 1.0.0 Intl. (SimpLex) - Borland C++ 5.5.1 Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 19 seconds ( Recno: 30000 ) First test base - 00 hour 00 minute 16 seconds Second test base - 00 hour 02 minute 30 seconds Third test base - 00 hour 00 minute 10 seconds Fourth test base - 00 hour 03 minute 55 seconds The total test time ---> 00 hour 07 minute 12 seconds Andrey пишет:Но тогда я сам могу создать функцию записи в журнал. Один раз его открыть в начале, потом писать в него (2 операции, указатель в конец файла и запись строки) и в конце проверки - закрыть файл. В моем примере (на классах так и сделано). Тексты выдернул из реальной проги MiniGUI, адаптировать к xHb - не должно составить труда. Вывод поколоночно с разделителем chr(9) в файлы log и err. Если что то не понятно - спрашивай. Сам работаю так: log файлы локально (имена рабочее место или имя (код) usera). Просмотр редактором. Если надо объединять, то через copy на сервер или иначе. Если просмотр через Browse - тогда конечно dbf.

Dima: У меня вот такой результат. Просто жесть (Исходник не смотрел) 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) 4 CPU 3.00GHz [~3011 MHz] Free RAM: 932 676 OS: Windows XP Professional 5.01.2600 Service Pack 2 Development: xHarbour build 1.0.0 Intl. (SimpLex) - Borland C++ 5.5.1 Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 09 seconds ( Recno: 30000 ) First test base - 00 hour 09 minute 37 seconds Second test base - Оборвал через 1 час на 30 %

Dima: Тот же тест на Clipper (First test base) 5 секунд -//- Harbour -//- порядка 9 минут Тормоз в STRFILE (Harbour) Намного быстрее если результат писать в базу. Можно сразу или писать в начале в массив а потом в базу [Проверил] А можно еще проще используя Alternate файлик вместо STRFILE , работает быстро.


santy: An example of measuring the speed of processing database for [x]Harbour Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> Russia, Dmitrov --------------------------------------------------------------------------- CPU: Pentium(R) Dual-CoreCPUE5700@ 3.00GHz [~3000 MHz] Free RAM: 2 097 151 OS: Windows XP Professional 5.01.2600 Service Pack 3 Development: xHarbour 1.2.3 Intl. (SimpLex) (Build 20121213) - Open Watcom C 12.90 (32 bit) Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 05 seconds ( Recno: 30000 ) First test base - 00 hour 00 minute 01 seconds Second test base - 00 hour 00 minute 04 seconds Third test base - 00 hour 00 minute 01 seconds Fourth test base - 00 hour 00 minute 05 seconds The total test time ---> 00 hour 00 minute 17 seconds *********************************** An example of measuring the speed of processing database for [x]Harbour Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> Russia, Dmitrov --------------------------------------------------------------------------- CPU: Pentium(R) Dual-CoreCPUE5700@ 3.00GHz [~3000 MHz] Free RAM: 2 097 151 OS: Windows XP 5.1.2600 Service Pack 3 Development: Harbour 3.2.0dev (Rev. 18748) - Open Watcom C 12.90 (32-bit) Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 05 seconds ( Recno: 30000 ) First test base - 00 hour 00 minute 01 seconds Second test base - 00 hour 00 minute 04 seconds Third test base - 00 hour 00 minute 00 seconds Fourth test base - 00 hour 00 minute 05 seconds The total test time ---> 00 hour 00 minute 17 seconds ******************************** An example of measuring the speed of processing database for [x]Harbour Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> Russia, Dmitrov --------------------------------------------------------------------------- CPU: Pentium(R) Dual-CoreCPUE5700@ 3.00GHz [~3000 MHz] Free RAM: 2 009 484 OS: Windows XP Professional 5.01.2600 Service Pack 3 Development: xHarbour 1.2.3 Intl. (SimpLex) (Build 20121213) - Borland C++ 5.8.2 (32 bit) Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 05 seconds ( Recno: 30000 ) First test base - 00 hour 00 minute 01 seconds Second test base - 00 hour 00 minute 05 seconds Third test base - 00 hour 00 minute 01 seconds Fourth test base - 00 hour 00 minute 07 seconds The total test time ---> 00 hour 00 minute 20 seconds ************************* An example of measuring the speed of processing database for [x]Harbour Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> Russia, Dmitrov --------------------------------------------------------------------------- CPU: Pentium(R) Dual-CoreCPUE5700@ 3.00GHz [~3000 MHz] Free RAM: 2 029 332 OS: Windows XP 5.1.2600 Service Pack 3 Development: Harbour 3.2.0dev (Rev. 18748) - Borland C++ 5.8.2 (32-bit) Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 04 seconds ( Recno: 30000 ) First test base - 00 hour 00 minute 01 seconds Second test base - 00 hour 00 minute 05 seconds Third test base - 00 hour 00 minute 00 seconds Fourth test base - 00 hour 00 minute 07 seconds The total test time ---> 00 hour 00 minute 19 seconds

Dima: Dima пишет: First test base - 00 hour 09 minute 37 seconds santy пишет: First test base - 00 hour 00 minute 01 seconds Фига себе разница.........

SergKis: Андрей, глянул prg: FUNCTION Third_Test_DBF(cFileError,cPOLE) добавьте:[pre2] LOCAL nPOLE, ; // позиция поля cPOLE в файле nNNN, ; // позиция поля ABONENT->NNN в файле nNN, ; // позиция поля ABONENT->NN в файле nKCity, ; // позиция поля ABONENT->KCity в файле nKStreet // позиция поля ABONENT->KStreet в файле ... SELECT ABONENT DbSetOrder(1) nKolRecords := ORDKEYCOUNT() nPOLE := FieldPos(cPOLE) nNNN := FieldPos("NNN") nNN := FieldPos("NN") nKCity := FieldPos("KCity") nKStreet := FieldPos("KStreet") ... cNNN := FieldGet(nPOLE) // cNNN := ABONENT->&cPOLE aYes := {} DO WHILE cNNN == FieldGet(nPOLE) // ABONENT->&cPOLE ... // заменить ABONENT->NNN на FieldGet(nNNN) // заменить ABONENT->NN на FieldGet(nNN) // и так далее AADD( aYes, cStr ) // этот массив лишний, надо сразу вывод в cFileError SKIP ENDDO IF LEN(aYes) > 1 ... AADD(aDimNNN, cStr ) // этот массив лишний, надо сразу вывод в cFileError ENDIF ... [/pre2] дальше по тексту, наверное, также поступить.

Andrey: Dima пишет: Тот же тест на Clipper (First test base) 5 секунд -//- Harbour -//- порядка 9 минут Тормоз в STRFILE (Harbour) Вот вот и я о том же... Клипер на многих вещах работает быстрее Харбора... Взять бы тот же SET FILTER TO - там оптимизация есть, а в Харборе нет... Переделал прогу на Харбор и успокоился... Ан нет нужно перепроверять !!! Я понял, что нужно писать свой STRFILE() ! Dima пишет: CPU: Intel(R) Pentium(R) 4 CPU 3.00GHz [~3011 MHz] Free RAM: 932 676 Самая классная машина для тестирования ! А то наставили всякого нового железа (включая меня самого) и все, алгоритмы побоку... Типа и так сойдет... А юзера страдают...

Andrey: SergKis пишет: DO WHILE cNNN == FieldGet(nPOLE) // ABONENT->&cPOLE ... // заменить ABONENT->NNN на FieldGet(nNNN) // заменить ABONENT->NN на FieldGet(nNN) Понял, спасибо ! Это для ускорения. SergKis пишет: AADD( aYes, cStr ) // этот массив лишний, надо сразу вывод в cFileError SKIP Тогда получиться лишний вывод равный количеству повтора... А операция создания массива aYes := {} и заполнения его - разве медленная ? SergKis пишет: IF LEN(aYes) > 1 ... AADD(aDimNNN, cStr ) // этот массив лишний, надо сразу вывод в cFileError ENDIF Я специально сделал вывод ОДНОГО значения повтора + перескок по базе на нужную запись минуя одинаковые: nI := nI + LEN(aYes) - 1

Dima: Andrey пишет: Я понял, что нужно писать свой STRFILE() Ты выше то читал ? Для этой задачи вполне покатит Set cons off Set alter on Set Alter to твой файлик ,,,,,,,,,,,,,,,, твой код ? "что то пишем в твой файл" close alter set alter off Ни когда не юзал что ли ?

Andrey: santy пишет: Development: xHarbour 1.2.3 Intl. (SimpLex) (Build 20121213) - Open Watcom C 12.90 (32 bit) The total test time ---> 00 hour 00 minute 17 seconds Development: Harbour 3.2.0dev (Rev. 18748) - Open Watcom C 12.90 (32-bit) The total test time ---> 00 hour 00 minute 17 seconds Development: xHarbour 1.2.3 Intl. (SimpLex) (Build 20121213) - Borland C++ 5.8.2 (32 bit) The total test time ---> 00 hour 00 minute 20 seconds Development: Harbour 3.2.0dev (Rev. 18748) - Borland C++ 5.8.2 (32-bit) The total test time ---> 00 hour 00 minute 19 seconds Разница между: Harbour 3.2.0dev и xHarbour 1.2.3 вообще ни какая... А мой тест ( xHarbour build 1.0.0 Intl. (SimpLex) - Borland C++ 5.5.1 ) сколько показывает ? santy пишет: Development: Harbour 3.2.0dev (Rev. 18748) - Open Watcom C 12.90 (32-bit) А тест на 70000 записей попробуй сделать ?

Andrey: Dima пишет: Ни когда не юзал что ли ? Неа ... не юзал ... А эти операторы быстрее будут: hFile:=Fopen(cFileError,FO_WRITE) ..... do while ... ...... FSEEK(hFile,0,FS_END) Fwrite(hFile, cStream, LEN(cStream)) ..... enddo ...... FClose( hFile )

Dima: Andrey пишет: Неа ... не юзал ... Юзани ;) Andrey пишет: А эти операторы быстрее будут: hFile:=Fopen(cFileError,FO_WRITE) ..... do while ... ...... FSEEK(hFile,0,FS_END) Fwrite(hFile, cStream, LEN(cStream)) ..... enddo ...... FClose( hFile ) Вот так будет быстрее на много порядков Set alter on Set alter to test.txt ..... do while ... ...... ? cStream ..... enddo ...... close alter set alter off

Andrey: Dima пишет: Вот так будет быстрее на много порядков Set alter on Set alter to test.txt Блин, а бегунок (проценты показа) тоже же будут в файл писаться (ударение на "а" ) ! Как там переключать то на экран/файл ? Я уже забыл....

Dima: Andrey пишет: Блин, а бегунок (проценты показа) тоже же будут в файл писаться (ударение на "а" ) ! НЕА ;)

Andrey: Вот блин поправил.... И МНОГОПОТОЧНУЮ проверку в этом случае делать не надо .... The second example of measuring the speed of processing database for [x]Harbour --------------------------------------------------------------------------- CPU: Intel(R) Core(TM) i5-3570K CPU @ 3.40GHz [~3504 MHz] Free RAM: 2 097 151 OS: Windows Windows Vista Professional 6.02.9200 Development: xHarbour build 1.0.0 Intl. (SimpLex) - Borland C++ 5.5.1 --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 02 seconds ( Recno: 70000 ) First test base - 00 hour 00 minute 04 seconds Second test base - 00 hour 00 minute 01 seconds Third test base - 00 hour 00 minute 04 seconds Fourth test base - 00 hour 00 minute 01 seconds The total test time ---> 00 hour 00 minute 14 seconds Предыдущая программа dBase2test.exe на этом же компе и с этой же базой: The total test time ---> 00 hour 00 minute 32 seconds Исходник и ехе-ник здесь - http://files.mail.ru/8842CDB5260248C8BB975F82D70C666E Народ, проверьте у себя пожалуйста !

Dima: Andrey The second 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) 4 CPU 3.00GHz [~3011 MHz] Free RAM: 837 448 OS: Windows XP Professional 5.01.2600 Service Pack 2 Development: xHarbour build 1.0.0 Intl. (SimpLex) - Borland C++ 5.5.1 Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 00 seconds ( Recno: 30000 ) First test base - 00 hour 00 minute 06 seconds Second test base - 00 hour 00 minute 03 seconds Third test base - 00 hour 00 minute 06 seconds Fourth test base - 00 hour 00 minute 04 seconds The total test time ---> 00 hour 00 minute 20 seconds

Dima: Andrey пишет: И МНОГОПОТОЧНУЮ проверку в этом случае делать не надо Ихгде ты ее делал ? Ни в одном твоем примере ее нет.

Andrey: Dima пишет: Ихгде ты ее делал ? Ни в одном твоем примере ее нет. Так я только собирался... Следующую проверку (тест) буду делать !

SergKis: The second example of measuring the speed of processing database for [x]Harbour Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> Russia, Dmitrov --------------------------------------------------------------------------- CPU: Genuine Intel(R) CPU T2130@ 1.86GHz [~1867 MHz] Free RAM: 1 362 460 OS: Windows Windows Vista Home Edition 6.01.7601 Service Pack 1 Development: xHarbour build 1.0.0 Intl. (SimpLex) - Borland C++ 5.5.1 Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 41 seconds ( Recno: 70000 ) First test base - 00 hour 00 minute 19 seconds Second test base - 00 hour 00 minute 04 seconds Third test base - 00 hour 00 minute 21 seconds Fourth test base - 00 hour 00 minute 06 seconds The total test time ---> 00 hour 01 minute 34 seconds Andrey пишет:А операция создания массива aYes := {} и заполнения его - разве медленная ? Если бы массив создавался один раз, а в данном случае происходит запрос,выделение памяти, освобождение и в какой то момент будет работать сборщик мусора, приостанавливающий работу программы - это конечно мелочь в сравнении с STRFILE, но иногда помнить об этом надо.

santy: The second example of measuring the speed of processing database for [x]Harbour Copyright 2013 Verchenko Andrey <verchenkoag@gmail.com> Russia, Dmitrov --------------------------------------------------------------------------- CPU: Pentium(R) Dual-CoreCPUE5700@ 3.00GHz [~3000 MHz] Free RAM: 2 097 151 OS: Windows XP Professional 5.01.2600 Service Pack 3 Development: xHarbour 1.2.3 Intl. (SimpLex) (Build 20121213) - Open Watcom C 12.90 (32 bit) Multi Thread: No --------------------------------------------------------------------------- Create/Open Test.dbf - 00 hour 00 minute 10 seconds ( Recno: 70000 ) First test base - 00 hour 00 minute 02 seconds Second test base - 00 hour 00 minute 01 seconds Third test base - 00 hour 00 minute 01 seconds Fourth test base - 00 hour 00 minute 01 seconds The total test time ---> 00 hour 00 minute 18 seconds



полная версия страницы