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

Как переписать записи из одной БД в другую БД ?

Andrey: Всем привет ! Столкнулся с проблемой, очень медленно идет запись из одной БД в другую БД. Т.е. когда меняешь структуру БД и имеешь 200-300 полей в базе при кол-ве записей: 150 000, то процесс обновления структуры становиться довольно утомительным занятием. Да еще нужен "бегунок" чтоб пользователь не подумал, что задача "висит" ! Вывод на экран тоже медленная операция ? Может не каждую запись отражать, а через 10% ? Можно ли как то ускорить этот процесс ? Задача на хХарборе, терминал gtwvt !

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

Andrey: Блин, облом.... FOR nI := 1 TO nRecno nTime2 := SECONDS() INKEY(1.33) // Обработка БАЗЫ // типа если запись обработана, то пропускаем запись @ 7,10 say LTRIM( Str( nI ) ) + "/" + LTRIM( Str( nRecno ) ) COLOR("15/1") cText := "прошло "+ SECTOTIME(nTime2 - nTime1) + " / осталось "+SECTOTIME((seconds()-nTime2)*(nRecno-nI)) ?? " "+cText NEXT Пишет почти всегда что осталось 00:00:00 Как быть ? Dima пишет: А у нас +44 Ваши +44 не сравняются с нашими +36 ! У нас влажность большая, почти 100%... Я жару нормально переношу, в Средней Азии вырос. А здесь, ну просто кранты....

Andrey: Вот примерно сделал так FUNCTION MAIM() LOCAL nI, cText, nTime1, nTime2, nRecno := 15, nTimeOneRec, nKoef :=0 SETMODE(25,70) SETCOLOR("11/1") CLEAR SCREEN ? "Тест функций подсчета количества времени обработки дляr [x]Harbour." ? PADC("",69,"-") ? " " + Version() + " - " + hb_compiler() ? ? nTime1 := SECOND() FOR nI := 1 TO nRecno nTime2 := SECONDS() cText := "прошло "+ SECTOTIME(nTime2 - nTime1) cText += " / осталось "+SECTOTIME( nKoef *(nRecno-nI) ) @ 7,10 say LTRIM( Str( nI ) ) + "/" + LTRIM( Str( nRecno ) ) COLOR("15/1") ?? " "+cText INKEY(1.45) nTimeOneRec := SECONDS() - nTime2 nKoef := MAX(nTimeOneRec,nKoef) NEXT RETURN NIL Только при первом запуске пишет, что осталось времени 00:00:00 ....

Dima: Andrey пишет: Только при первом запуске пишет, что осталось времени 00:00:00 .... Значит и выводи соответсвующую месагу при nI равным 1 и пиши что то типа время уточняется (или ориентируйся на nKoef ). Винда ведь при копировании большого кол-ва файлов тоже не сразу показывает сколько времени осталось. В Far Manager аналогично , пару секунд или около того цифры о времени просто не рисуются. ЗЫ А лучше всего вообще ни чего не рисуй пока не обработаешь хотя бы одну запись.


AndreyZh: Форум - гад! Съел такое хорошее моё сообщение... Приведу "кастрированный" вариант: sele base nc := base->(lastrec()) nj := 0 nTimer := seconds() dbgotop() do whil !Eof() ... nPer := ++nJ*100/nC nS := Seconds()-nTimer nT := nS*100/nPer // Прошло @2,21 SAY Ntoc(Int(nT/60),10,2,"0")+":"+Ntoc(nT%60,10,2,"0") // Осталось @2,34 SAY Ntoc(Int(nS/60),10,2,"0")+":"+Ntoc(nS%60,10,2,"0") // Процент выполнения @2,49 SAY Str(nPer,3) DbSkip() endd Вообще можно посмотреть функции (FUNC_NEW.PRG) и их применения в моих исходников: pOpenView Открытие окна_шаблона бегущей строки на фоне экрана дисплея. pChangeView Отражение на шаблоне процента исполнения. Передается процент pCloseView Восстановление окружающей среды программы А в Саратове по термометру 46 - спасаюсь кондиционерами дома и в авто

Andrey: Вот блин поймал прикол ....

Dima: AndreyZh пишет: Съел такое хорошее моё сообщение. Это как ? Может ты замерз под кондиционером и не ту кнопочку нажал (вот форум и не понял) ?

Dima: Andrey пишет: Вот блин поймал прикол

AndreyZh: Это как ? Уже неоднократно! После нажатия "отправить" пишет, что "не удалось". Предлагается вернуться назад и повторить отправку, а набранного сочинения уже нетучки..

Dima: AndreyZh Тогда на всякий пожарный cлучай копируй весь текст перед отправкой в буфер обмена. ЗЫ Какой браузер используешь ? У меня в Opera и Mozilla таких проблем не было , не считая случаев когда глючил форум или мой провайдер.

Andrey: AndreyZh Не работает твой вариант ! Пример здесь FUNCTION MAIN() LOCAL nI, cText, nTime1, nTime2, nRecno := 15, nT, nSec, nPer SETMODE(25,70) SETCOLOR("11/1") CLEAR SCREEN ? "Тест функций подсчета количества времени обработки дляr [x]Harbour." ? PADC("",69,"-") ? " " + Version() + " - " + hb_compiler() ? ? nTime1 := SECOND() FOR nI := 1 TO nRecno nTime2 := SECONDS() nPer := nI*100/nRecno nSec := nTime2 - nTime1 nT := nSec*100/nPer cText := "прошло " + Ntoc(Int(nT/60),10,2,"0")+":"+Ntoc(nT%60,10,2,"0") cText += " / осталось " + Ntoc(Int(nSec/60),10,2,"0")+":"+Ntoc(nSec%60,10,2,"0") @ 7,10 say LTRIM( Str( nI ) ) + "/" + LTRIM( Str( nRecno ) ) COLOR("15/1") ?? " "+cText ?? " "+TRANSFORM(nPer,"@ 999%") // Обработка БАЗЫ // Включая, пропуск обработки записей, т.е. на обработку записи тратиться 0 сек. // эмулятор обработки базы INKEY(1.45) // эмулятор обработки базы IF nI == 1 .OR. nI == 5 // пропуск обработки ELSE INKEY(0.21) // эмулятор обработки базы ENDIF NEXT RETURN NIL Кто следующий ?

Dima: Andrey пишет: Кто следующий ? Андрей ты сегодня перегрелся , пора отдохнуть :)

PSP: Значицца так... 1. Прошло времени: nЗатраченноеВремя := nTime2 - nTime1 (nTime2-вычисляется при каждой итерации, nTime1-вычисляется один раз перед началом обработки). 2. Осталось времени (пропорция): nОставшеесяВремя := nЗатраченноеВремя * nВсегоЗаписей / nОбработаноЗаписей.

Andrey: PSP пишет: Значицца так... 1. Прошло времени: nЗатраченноеВремя := nTime2 - nTime1 (nTime2-вычисляется при каждой итерации, nTime1-вычисляется один раз перед началом обработки). 2. Осталось времени (пропорция): nОставшеесяВремя := nЗатраченноеВремя * nВсегоЗаписей / nОбработаноЗаписей. Не пашет ! Может надо nОставшеесяВремя := nЗатраченноеВремя * nВсегоЗаписей / nОбработаноЗаписей - nЗатраченноеВремя ? Dima пишет: Андрей ты сегодня перегрелся , пора отдохнуть :) Это точно.... Башка не варит вообще.... Сейчас у нас дождик прошел... Посвежело...

Andrey: Ура ! Вроде получилось ! Спасибо всем БОЛЬШОЕ ! Рабочий пример здесь .... FUNCTION MAIN() LOCAL nI, cText, nTime1, nTime2, nRecno := 55, nOst, nSec, nPer SETMODE(25,70) SETCOLOR("11/1") CLEAR SCREEN ? "Тест функций подсчета количества времени обработки дляr [x]Harbour." ? PADC("",69,"-") ? " " + Version() + " - " + hb_compiler() ? ? nTime1 := SECOND() FOR nI := 1 TO nRecno nTime2 := SECONDS() nPer := nI*100/nRecno nSec := nTime2 - nTime1 nOst := nSec * nRecno / nI - nSec cText := "прошло " + Ntoc(Int(nSec/60),,2,"0")+":"+Ntoc(nSec%60,,2,"0") cText += " / осталось " + Ntoc(Int(nOst/60),,2,"0")+":"+Ntoc(nOst%60,,2,"0") //cText := "прошло " + Ntoc(Int(nSec/60),10,2,"0")+":"+Ntoc(nSec%60,10,2,"0") //cText += " / осталось " + Ntoc(Int(nT/60),10,2,"0")+":"+Ntoc(nT%60,10,2,"0") @ 7,5 say LTRIM( Str( nI ) ) + "/" + LTRIM( Str( nRecno ) ) COLOR("15/1") ? " "+cText ?? " "+TRANSFORM(nPer,"@ 999%") // Обработка БАЗЫ // Включая, пропуск обработки записей, т.е. на обработку записи тратиться 0 сек. // эмулятор обработки базы INKEY(0.42) // эмулятор обработки базы IF nI == 1 .OR. nI == 5 // пропуск обработки ELSE INKEY(0.21) // эмулятор обработки базы ENDIF NEXT RETURN NIL

Dima: Andrey пишет: Это точно.... Башка не варит вообще.... Cлухай ты же не компьютер и башка у тебя не железная , просто отдохни и с утряка все пойдет само собой ;)

Andrey: Dima пишет: просто отдохни и с утряка все пойдет само собой ;) До утра дожить надо.... А утром другие дела нужно делать... Не смотря на воскресенье....

PSP: Andrey пишет: Может надо nОставшеесяВремя := nЗатраченноеВремя * nВсегоЗаписей / nОбработаноЗаписей - nЗатраченноеВремя ? Ну типа того... :) Я просто слеххка был нетрезв... :)

Andrey: Теперь другая напасть. Подсчет остатка идет нормально. Но как случается 00:00 (полночь) то бегунок "глючит" !!! Что делать ?

Dima: Andrey пишет: Но как случается 00:00 (полночь) А подумать ?

Andrey: Dima пишет: А подумать ? Думалка за 2 недели совсем не соображает.....



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