Форум » [x]Harbour » Копирование открытых баз данных » Ответить

Копирование открытых баз данных

Dima: Имею непонятку. Cтал в последнее время замечать что скорость копирования базы а она на данный момент весит 10 гиг , стало занимать до ~15 минут , хотя пару недель назад это время было всего ~32 секунды. Провел эксперимент , в базах ни кого нет , время копирования базы заняло ~32 секунды , зашел в прогу и перешел в раздел где открывается много баз и снова запустил копирование , цирк ...время заняло ~ 33 секунды и ни какими минутами и не пахнет. Копирую базы так [pre2] FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) hb_releaseCPU() Next [/pre2] Винт SSD и ему почти 2 года. Не пойму куда копать ....есть какие мысли у кого ?

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

PSP: А при каком условии долго? Когда больше одного работает?

Dima: PSP пишет: А при каком условии долго? Когда больше одного работает? Да выяснил вчера , что при повторном копировании время занимает почему то в 2.5 - 3 раза больше чем при первоначальном копировании. А копирование происходит 1 раз в час , соответственно через часов 7-8 выйдем на результат в 15 минут. Почему не понял.

PSP: А если интервал увеличить или уменьшить? Эффект какой будет?


SergKis: Попробуй XCopy, у меня каждые 2-а часа планировщик запускает получение zip+xcopy на др. PC. Что будет ? Когда у тебя тормозит, что будет на xCopy ?

Dima: Убрал пока из цикла hb_releaseCPU() Вышел на 16 сек Через 1 час проверю

Haz: SergKis пишет: Попробуй XCopy, у меня каждые 2-а часа планировщик запускает получение zip+xcopy на др. PC. вместо xCopy лучше использовать RoboCopy, утилита более продвинутая и оптимизирована на работу в сети

SergKis: Haz пишет вместо xCopy лучше использовать RoboCopy, утилита более продвинутая и оптимизирована на работу в сети Возможно и лучше, но admin (это чужие PC) вряд ли будет ставить лишнюю утилиту, если работают штатные, тем более это работа сервер-сервер, на одном работает от планировщика gbak+7z, на другом полученные файлы 7z планировщик забирает xCopy по маске

Dima: SergKis так она штатная

Dima: короче при первом запуске копирования 16 сек спустя час , та же операция 43 сек спустя час , та же операция 54 сек Просто уже интересно , почему так...

SergKis: Haz пишет лучше использовать RoboCopy Dima пишет так она штатная Спасибо, не знал, что есть такая штука. Dima пишет 54 сек Просто уже интересно , почему так... Как штатные копирования ведут себя в это время (или за это время) ?

Dima: Штатные работают чуть медленнее а вот причину замедления я кажись нашел. Было [pre2] FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) Next [/pre2] Стало [pre2] hLib := hb_libLoad( "Kernel32.dll" ) IF ! Empty( hLib ) FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", hLib, HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) Next hb_libFree( hLib ) ENDIF [/pre2] Потестил у себя на компе в цикле на большом файле , время практически одинаково а в первом варианте стабильно растет

PSP: Получается, что была утечка памяти. Память не освобождалась после вызова dll и в конце концов всё больше и больше использовался файл подкачки. Отсюда и тормоза. Имхо.

Pasha: Dima пишет: Стало hLib := hb_libLoad( "Kernel32.dll" ) IF ! Empty( hLib ) FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", hLib, HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) Next hb_libFree( hLib ) ENDIF Можно еще проще: FOR EACH aFile IN aDir win_CopyFile(pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1], .f.) NEXT ... #pragma BEGINDUMP #include "hbapi.h" #include "windows.h" HB_FUNC( WIN_COPYFILE ) { hb_retnl( (LONG) CopyFile( (LPCSTR) hb_parc(1), (LPCSTR) hb_parc(2), HB_ISNIL(3) ? FALSE : (BOOL) hb_parl(3) ) ); } #pragma ENDDUMP вместо CopyFile будет вызвана либо неуникодная CopyFileA, либо уникодная CopyFileW

Andrey: Dima пишет: Cтал в последнее время замечать что скорость копирования базы Чисто теоретический вопрос - а не проще скидывать изменённые данные в базах на другой комп/сервер ? Или с другого компа/сервера подключаться к базам через определённое время и копировать только изменённые записи

Dima: Pasha Пробну , спасибо !

Dima: Pasha пишет: Можно еще проще Пожалуй это самый быстрый способ копирования. После первого прохода база в 10 гиг скопировалась за 15 сек (с базой работает 17 чел на сейчас) Подожду еще пары проходов и через 2-3 часа выложу результат

Dima: Вот и статистика приехала [pre2] Начало копирования : 2023-11-30 14:28:44.002 UserCount : 17 Конец копирования : 2023-11-30 14:29:00.877 Время копирования : 16.87 --------------------- Начало копирования : 2023-11-30 15:31:51.887 UserCount : 12 Конец копирования : 2023-11-30 15:32:29.873 Время копирования : 37.99 --------------------- Начало копирования : 2023-11-30 16:34:58.577 UserCount : 11 Конец копирования : 2023-11-30 16:35:52.881 Время копирования : 54.30 --------------------- Начало копирования : 2023-11-30 17:38:06.308 UserCount : 7 Конец копирования : 2023-11-30 17:39:22.358 Время копирования : 76.05 --------------------- [/pre2] Почему растет время не понятно ....база данных за 1 час не сильно наполняется. PS Копирование происходит в потоке.

SergKis: Dima пишет Почему растет время не понятно ... Тогда получается, что такой твой вариант лучше ?! Потестил у себя на компе в цикле на большом файле , время практически одинаково ... hLib := hb_libLoad( "Kernel32.dll" ) IF ! Empty( hLib ) FOR EACH aFile IN aDir hb_DynCall({ "CopyFileA", hLib, HB_DYN_CALLCONV_STDCALL },pathbase+"dbf\"+afile[1],pathbase+"zip\"+afile[1],0) Next hb_libFree( hLib ) ENDIF

Dima: SergKis пишет: Тогда получается, что такой твой вариант лучше ?! Оказалось что нет , мало замеров на тот момент сделал. Сравнил по скорости win_CopyFile и HB_VFCOPYFILE. В цикле от 1 до 3 копирую файлик на 2 гига win_CopyFile время 36.62 53.17 48.71 HB_VFCOPYFILE 41.62 43.62 40.51

SergKis: Dima Получается большой разницы нет, набежит ~30 сек. даже пусть минута - это же поток и не мешает работе Если биться за скорость, то, правда, можно в больших базах брать только измененные записи, т.е., например, первого числа взял весь файл, а потом, из него, только записи новые и измененные, надо, конечно поле иметь TimeStamp модификации и так до след. первого числа



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