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




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


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

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

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

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




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


постоянный участник




Пост N: 2657
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.02.13 11:56. Заголовок: Dima пишет: CPU: In..


Dima пишет:

 цитата:
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
---------------------------------------------------------------------------
The total test time ---> 00 hour 00 minute 20 seconds


Даже на слабенькой машине теперь все летает !
Значит STRFILE() в Харборе - отстой....

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


Пост N: 555
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 12.02.13 13:41. Заголовок: Все в порядке с Strf..


Все в порядке с Strfile(), просто надо знать, в каких случаях ее использование целесообразно, а в каких - нет.
Она сначала проверяет, если файл с именем, которые вы ей передали, потом, в зависимости от результата, создает новый или открывает существующий, записывает туда строку и закрывает его. Делать это в цикле, естественно, крайне нерационально.

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




Пост N: 2659
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.02.13 14:35. Заголовок: alkresin пишет: Дел..


alkresin пишет:

 цитата:
Делать это в цикле, естественно, крайне нерационально.


Сейчас согласен с этим.

А на Клипере все работало без "тормозов"...
Дима проверял.

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




Пост N: 2661
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.02.13 19:13. Заголовок: Вот нашел старичка -..


Вот нашел старичка - ноутбук Samsung R40. Неплохую скорость показывает....
The second example of measuring the speed of processing database for [x]Harbour
---------------------------------------------------------------------------
CPU: Intel(R) Celeron(R) M CPU410@ 1.46GHz [~1468 MHz]
Free RAM: 1 354 160
OS: Windows XP Home Edition 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 14 seconds ( Recno: 70000 )
First test base - 00 hour 00 minute 11 seconds
Second test base - 00 hour 00 minute 03 seconds
Third test base - 00 hour 00 minute 09 seconds
Fourth test base - 00 hour 00 minute 04 seconds
The total test time ---> 00 hour 00 minute 43 seconds


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



Пост N: 1
Зарегистрирован: 07.02.13
ссылка на сообщение  Отправлено: 12.02.13 20:03. Заголовок: У меня Win8 Pro, а п..


У меня Win8 Pro, а прога выдает какую-то Vista ... Абидна, да!

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) Core(TM) i7-3610QM CPU @ 2.30GHz [~2296 MHz]
Free RAM: 2 752 236
OS: Windows Windows Vista Professional 6.02.9200
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: 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 11 seconds


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




Пост N: 2662
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.02.13 21:07. Заголовок: MTC пишет: У меня W..


MTC пишет:

 цитата:
У меня Win8 Pro, а прога выдает какую-то Vista ... Абидна, да!


Да у меня тоже самое выдает ....
CPU: Intel(R) Core(TM) i5-3570K CPU @ 3.40GHz [~3504 MHz]
OS: Windows Windows Vista Professional 6.02.9200


В хХарборе 1.2 и 1.0 нет функции определения для Win8 ...
А как самому написать/переделать в winos.prg я не знаю...


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


Пост N: 827
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 13.02.13 09:48. Заголовок: Андрей, думаю, что w..


Андрей, думаю, что исправление winos.prg тут не требуется. Может вместо функции OS() использовать, к примеру, OS_VersionInfo()?



Это, собственно, winos.prg: http://sourceforge.net/p/xharbour/code/9908/tree/trunk/xharbour/source/rtl/winos.prg
Там есть и 7-ка, и 8-ка... У Висты версия 6.0, у 7-ки - 6.1, у 8-ки - 6.2

update: мдаааа, чё-та OS_VersionInfo() тоже не хочет... Проще свою написать.

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




Пост N: 2663
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.02.13 11:28. Заголовок: PSP Спасибо БОЛЬШОЕ ..


PSP Спасибо БОЛЬШОЕ !

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


Пост N: 828
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 13.02.13 11:29. Заголовок: Не спеши... ))) Я та..


Не спеши... ))) Я там подправил сообщение. Проверь функцию.

update: Проверил в Харборе WIN_OSVersionInfo(). Нормально работает. WIN_OSVersionInfo()[ 2 ] на 7-ке выдало "1".

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




Пост N: 2664
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.02.13 01:25. Заголовок: Вот сделал другой те..


Вот сделал другой тест (запись части полей из одной БД в другую), хоть немного нагружает машину.
---------------------------------------------------------------------------
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 04 seconds ( Recno: 2525/127500 )
Write test base - 00 hour 04 minute 06 seconds
The total test time ---> 00 hour 04 minute 11 seconds

Может его можно переделать в МНОГОПОТОЧНЫЙ ?

Исходник и прога здесь - http://files.mail.ru/FCA060C7F8654447B070A668070E4981

Пробую прогнать свой тест на реальных данных, почему то выходит порядка 30 минут ? Почему ???
Может из-за того что в ОБЩЕЙ системе (кроме одного этого теста) есть много других функций ?
Размер моей ОБЩЕЙ проги на хХарборе 5152 Кб (в памяти занимает 70,3 Мб, загрузка проца 3% ),
а тестового примера dBase5test.exe - 842752 байт (в памяти занимает 1,4 Мб, загрузка проца 30% ) ......
Странное несоответствие теста и реальной программы....

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




Пост N: 122
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.02.13 11:56. Заголовок: Andrey пишет:Может е..


Andrey пишет:
 цитата:
Может его можно переделать в МНОГОПОТОЧНЫЙ ?


Надо сначала его почистить - лишние перегонки данных по памяти убрать, а потом смотреть:
Скрытый текст


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




Пост N: 123
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.02.13 12:34. Заголовок: SergKis пишет:Надо с..


SergKis пишет:
 цитата:
Надо сначала его почистить


Вдогонку. Возможно надо воспользоваться функциями, которые выкладывал Паша на сайте и использует их в DbEdit.prg (тексты в конце prg). Я говорю о dbGetValue(...) и dbPutValue(...).
// Получить значение поля как строка: 
// ---------------------------
// if FieldType(nPos) == "C"; xVal := FieldGet(nPos)
// else ; xVal := dbGetValue(nPos)
// endif
// -----------------------------
// Сохранить значение поля как строка:
// ---------------------------
// if FieldType(nPos) == "C"; FieldPut(nPos, xVal)
// else ; dbPutValue(nPos, xVal)
// endif
// -----------------------------
исключаются преобразования типов.


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




Пост N: 124
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.02.13 12:55. Заголовок: Andrey насколько акт..


Andrey насколько актуально DBCOMMIT() после кажной записи, а не через 10 или 100 ?

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




Пост N: 2665
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.02.13 13:25. Заголовок: SergKis пишет: nKCi..


SergKis пишет:

 цитата:
nKCity := FieldPos("KCity") // вынести сюда или в начале prg файла перечислите все поля dbf
nKStreet := FieldPos("KStreet") // FIELD KCity,KSteet,FIO,NNN,NN... и используйте их без Alias-> и FIELD->// для тек. alias


Насколько это актуально ? Можно ли обойтись без этого ?
А то код непривычно читать .... Если нельзя, то будем привыкать...

SergKis пишет:

 цитата:
FSeek( nHandle, 0, FS_END ) // это зачем ? таких мест несколько


А при такой записи в файл, указатель ВСЕГДА остается в конце файла ?
Я просто не знаю.

SergKis пишет:

 цитата:
насколько актуально DBCOMMIT() после кажной записи, а не через 10 или 100 ?


Вообще не актуально... Ваши рекомендации ?

Насчет остального понял. Спасибо БОЛЬШОЕ !

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




Пост N: 125
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.02.13 14:08. Заголовок: Andrey пишет:А то ко..


Andrey пишет:
 цитата:
А то код непривычно читать ....


 
aAbn := array(20)
aAbn[1] := {"KCity" , 0, 0, NIL}
aAbn[2] := {"KStreet", 0, 0, NIL}
...
sele DOGOVOR
AEval(aAbn, {|a,n| a[ 3 ] := FieldPos(a[ 1 ])})

sele ABONENT
AEval(aAbn, {|a,n| a[ 2 ] := FieldPos(a[ 1 ])})
...
FOR i := 1 TO nKolRecords
...
sele ABONENT
AEval(aAbn, {|a,n| a[ 4 ] := FieldGet(a[ 2 ])})
...
sele DOGOVOR
AEval(aAbn, {|a,n| FieldPut(a[ 3 ], a[ 4 ])})
...
на мой взгляд, кратко и понятно.

Если другого exe-шника нет подключенного к базе - DBCOMMIT() перед закрытием табл., иначе надо смотреть как быстро измененные данные должны попадать на диск.

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




Пост N: 2667
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.02.13 14:45. Заголовок: Andrey пишет: Стран..


Andrey пишет:

 цитата:
Странное несоответствие теста и реальной программы


Разобрался я в этой ситуации... Я тестировал прогу на одном компе но на разных винчестерах: SSD и обычном.
Если база располагается на SSD - то загрузка проца возрастает и
тест-dBase5test.exe проходит в 14,5 раз быстрее !
dBase5test.exe - размер файла 842752 байт, программа в памяти занимает 1,3 - 1,6 Мб
Две тестовые базы - Recno: 2525/127500
На SSD HDD загрузка проца 30% - время счета 04 minute 11 seconds
На обычном HDD загрузка проца 1,6% - время счета 59 minute 58 seconds
Вот такие результаты...


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




Пост N: 2626
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.02.13 14:49. Заголовок: Andrey пишет: Если ..


Andrey пишет:

 цитата:
Если база располагается на SSD - то загрузка проца возрастает и
тест-dBase5test.exe проходит в 14,5 раз быстрее !


Ты еще на RAM диске запусти , будет еще быстрее ;) Ориентироваться надо на обычные HDD.

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



Пост N: 33
Зарегистрирован: 07.06.08
ссылка на сообщение  Отправлено: 14.02.13 14:57. Заголовок: Похоже дело в DBCOMM..


Похоже дело в DBCOMMIT() на каждой записи, если вынести его за цикл, то время уменьшается в несколько десятков раз

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




Пост N: 2668
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.02.13 14:57. Заголовок: Dima пишет: Ты еще ..


Dima пишет:

 цитата:
Ты еще на RAM диске запусти


Да забыл...

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




Пост N: 2670
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.02.13 18:00. Заголовок: Вот прислал мне a_si..


Вот прислал мне a_sidorov модифицированную программу. Спасибо БОЛЬШОЕ !
Это то что нужно... Главное понимать что и когда делать...

По производительности, предыдущий тест:
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
Multi Thread: No
---------------------------------------------------------------------------
Create/Open Test.dbf - 00 hour 00 minute 00 seconds ( Recno: 2525/127500 )
Write test base - 00 hour 59 minute 59 seconds
The total test time ---> 00 hour 59 minute 59 seconds

Модифицированный тест, на этом же компе:
Create/Open Test.dbf - 00 hour 00 minute 00 seconds ( Recno: 2525/127500 )
Write test base - 00 hour 00 minute 08 seconds
The total test time ---> 00 hour 00 minute 08 seconds

Результат классный !!!
Жалко только опять примера нет на МНОГОПОТОКОВУЮ обработку базы....
Исходник и пример здесь - http://files.mail.ru/ADB643696C364CC983BE1BC5FE1B9D3F

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

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