Автор | Сообщение |
|
| постоянный участник
|
Пост N: 2517
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.12.12 14:01. Заголовок: Как сделать многопотоковую проверку Базы ?
Есть ряд задач (переодически возникающих) на которые тратиться много времени. Может быть я и не прав. Вот например: база 20 тыс.записей, каждую запись нужно пройти и проверить заполнение полей, если не заполнено - ошибку в тхт-файл. Все (наверно) делают последовательную обработку, т.е. проверяем базу с 1 по N-запись.. А можно же через потоки сделать ? Подскажите как примерно это можно сделать для хХарбора ? Заранее спасибо..
|
|
|
Ответов - 78
, стр:
1
2
3
4
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 118
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.02.13 13:38. Заголовок: 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: 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.
|
|
|
|
| |
Пост N: 2618
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.02.13 16:36. Заголовок: У меня вот такой рез..
У меня вот такой результат. Просто жесть (Исходник не смотрел) 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 %
|
|
|
|
| |
Пост N: 2619
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.02.13 17:18. Заголовок: Тот же тест на Clipp..
Тот же тест на Clipper (First test base) 5 секунд -//- Harbour -//- порядка 9 минут Тормоз в STRFILE (Harbour) Намного быстрее если результат писать в базу. Можно сразу или писать в начале в массив а потом в базу [Проверил] А можно еще проще используя Alternate файлик вместо STRFILE , работает быстро.
|
|
|
|
| |
Пост N: 164
Зарегистрирован: 16.12.08
|
|
Отправлено: 11.02.13 17:39. Заголовок: 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: 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
|
|
|
|
| |
Пост N: 2620
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.02.13 17:45. Заголовок: Dima пишет: First t..
Dima пишет: цитата: | First test base - 00 hour 09 minute 37 seconds |
| santy пишет: цитата: | First test base - 00 hour 00 minute 01 seconds |
| Фига себе разница.........
|
|
|
|
| постоянный участник
|
Пост N: 119
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.02.13 18:06. Заголовок: Андрей, глянул prg:..
Андрей, глянул prg: FUNCTION Third_Test_DBF(cFileError,cPOLE) добавьте: 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 ... дальше по тексту, наверное, также поступить.
|
|
|
|
| постоянный участник
|
Пост N: 2649
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.02.13 21:11. Заголовок: Dima пишет: Тот же ..
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 |
| Самая классная машина для тестирования ! А то наставили всякого нового железа (включая меня самого) и все, алгоритмы побоку... Типа и так сойдет... А юзера страдают...
|
|
|
|
| постоянный участник
|
Пост N: 2650
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.02.13 21:20. Заголовок: SergKis пишет: DO W..
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
|
|
|
|
| |
Пост N: 2621
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.02.13 21:20. Заголовок: Andrey пишет: Я пон..
Andrey пишет: цитата: | Я понял, что нужно писать свой STRFILE() |
| Ты выше то читал ? Для этой задачи вполне покатит Set cons off Set alter on Set Alter to твой файлик ,,,,,,,,,,,,,,,, твой код ? "что то пишем в твой файл" close alter set alter off Ни когда не юзал что ли ?
|
|
|
|
| постоянный участник
|
Пост N: 2651
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.02.13 21:21. Заголовок: santy пишет: Develo..
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 записей попробуй сделать ?
|
|
|
|
| постоянный участник
|
Пост N: 2652
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.02.13 21:44. Заголовок: Dima пишет: Ни когд..
Dima пишет: цитата: | Ни когда не юзал что ли ? |
| Неа ... не юзал ... А эти операторы быстрее будут: hFile:=Fopen(cFileError,FO_WRITE) ..... do while ... ...... FSEEK(hFile,0,FS_END) Fwrite(hFile, cStream, LEN(cStream)) ..... enddo ...... FClose( hFile )
|
|
|
|
|
| |
Пост N: 2622
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.02.13 22:07. Заголовок: Andrey пишет: Неа ...
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
|
|
|
|
| постоянный участник
|
Пост N: 2653
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.02.13 22:26. Заголовок: Dima пишет: Вот так..
Dima пишет: цитата: | Вот так будет быстрее на много порядков Set alter on Set alter to test.txt |
| Блин, а бегунок (проценты показа) тоже же будут в файл писаться (ударение на "а" ) ! Как там переключать то на экран/файл ? Я уже забыл....
|
|
|
|
| |
Пост N: 2623
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.02.13 22:41. Заголовок: Andrey пишет: Блин,..
Andrey пишет: цитата: | Блин, а бегунок (проценты показа) тоже же будут в файл писаться (ударение на "а" ) ! |
| НЕА ;)
|
|
|
|
| постоянный участник
|
Пост N: 2654
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.02.13 23:12. Заголовок: Вот блин поправил.....
Вот блин поправил.... И МНОГОПОТОЧНУЮ проверку в этом случае делать не надо .... 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 Народ, проверьте у себя пожалуйста !
|
|
|
|
| |
Пост N: 2624
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.02.13 23:30. Заголовок: Andrey The second ..
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
|
|
|
|
| |
Пост N: 2625
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.02.13 23:39. Заголовок: Andrey пишет: И МНО..
Andrey пишет: цитата: | И МНОГОПОТОЧНУЮ проверку в этом случае делать не надо |
| Ихгде ты ее делал ? Ни в одном твоем примере ее нет.
|
|
|
|
| постоянный участник
|
Пост N: 2655
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.02.13 02:16. Заголовок: Dima пишет: Ихгде т..
Dima пишет: цитата: | Ихгде ты ее делал ? Ни в одном твоем примере ее нет. |
| Так я только собирался... Следующую проверку (тест) буду делать !
|
|
|
|
| постоянный участник
|
Пост N: 120
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.02.13 10:09. Заголовок: The second example o..
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, но иногда помнить об этом надо.
|
|
|
|
| |
Пост N: 165
Зарегистрирован: 16.12.08
|
|
Отправлено: 12.02.13 11:12. Заголовок: The second example o..
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
|
|
|
Ответов - 78
, стр:
1
2
3
4
All
[только новые]
|
|