Форум » [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

Dima: SergKis Тут не столько борьба за скорость , хотя она тоже важна , тут битва идёт уже что бы время не расло всё время. Если задачу не перезапускать то в какой то момент через ..надцать дней скажем , копирование может занять 1 час или типа того.

SergKis: Dima пишет Если задачу не перезапускать то в какой то момент через ..надцать дней скажем Вынь из задачи, помести в фоновый поток, например на планировщик запуск, твоего же exe с параметром только для выполнения копии, или твоя задача по timer запускает себя с параметром для вып. копии

Dima: Нет , планировщик не использую а вот сам процесс копирования действительно можно вынести в отдельный EXE и из потока его запускать. Должно помочь думается в плане времени копирования , так как первый раз всегда отрабатывает быстро


SergKis: Ты можешь не выносить из exe (там у тебя все определено и отлажено и есть вызов), сделай параметр входа для копирования и запускай тот же exe с этим параметром. Зачем лишние exe плодить ? Не всегда это оправдано

Pasha: Dima пишет: Оказалось что нет , мало замеров на тот момент сделал. Сравнил по скорости win_CopyFile и HB_VFCOPYFILE. В цикле от 1 до 3 копирую файлик на 2 гига win_CopyFile время 36.62 53.17 48.71 HB_VFCOPYFILE 41.62 43.62 40.51 win_CopyFile - это просто обертка для winapi-шной CopyFile. Как она работает, что там внутри делается - неизвестно. HB_VFCOPYFILE - там все прозрачно, исходный файл читается последовательно в буфер размером 64k, и этот буфер пишется в результирующий файл. Понятно, что windows еще сама как-то буферизирует эти операции чтения - записи. Для огромных файлов буфер 64k явно маловат. Можно сделать свой аналог, в котором задавать размер буфера

Pasha: Dima пишет: SergKis Тут не столько борьба за скорость , хотя она тоже важна , тут битва идёт уже что бы время не расло всё время. Если задачу не перезапускать то в какой то момент через ..надцать дней скажем , копирование может занять 1 час или типа того. Так нет чистого времени копирования, слишком много факторов влияют на время в каждом случае. Скажем, в это время качается обновление винды, диск занят и на другие операции, время скакнет. Или антивирус вздумает запустить проверку, и дергает тот же диск. А таких или может быть сколько угодно. Важно удостовериться, что у тебя все организовано без дырок, и более-менее оптимально

PSP: Разрешите вставить свои 5 копеек) Вот, если речь идет о бэкапе, то, имхо, тут лучше использовать сторонние средства. Я пользуюсь Cobian Backup. Отличная штука. Она использует механизм теневых копий, так что может копировать открытые в других программах файлы. Весьма удобна.

Dima: PSP пишет: Cobian Backup Интересная тулза и главное бесплатно

PSP: Она работает чётко. Много лет ей пользуюсь)

Dima: Pasha пишет: Так нет чистого времени копирования, слишком много факторов влияют на время в каждом случае. Скажем, в это время качается обновление винды, диск занят и на другие операции, время скакнет. Или антивирус вздумает запустить проверку, и дергает тот же диск. А таких или может быть сколько угодно. Важно удостовериться, что у тебя все организовано без дырок, и более-менее оптимально Ну как бы согласен теоретически ...., не поленился и поставил эксперимент , запустил приложение которое в том числе выполняет и копирование базы данных (в сети была куча юзеров) , отработало копирование , вышел из задачи и так 10 раз подряд Время копирования 15-16 секунд а вот если не выгружать и дать ему работать и каждый час копировать то статистика в секундах следующая. [pre2] Время копирования : 16.46 //1 запуск Время копирования : 36.50 Время копирования : 58.74 Время копирования : 74.52 Время копирования : 96.05 Время копирования : 116.97 Время копирования : 133.02 Время копирования : 158.03 Время копирования : 176.51 Время копирования : 204.95 Время копирования : 218.67 Время копирования : 239.52 Время копирования : 259.55 Время копирования : 281.21 Время копирования : 296.34 [/pre2]

Dima: Проблему решил костылём. Если время копирования базы превышает N секунд , убиваю поток и заново его запускаю. Работает однако. PS Почему росло время хз.

PSP: В плане бреда... А что, если дескрипторы файла "zip\..." остаются открытыми после копирования и со временем их становится много, как будто файл открыт из разных программ, а? Тут возникаю вопросы с блокировками, кэшированием и т.д.

PSP: Вот нечто https://www.cyberforum.ru/win-api/thread983172.html

Dima: PSP Фиг его знает , я тестил все возможные функции по копированию и всегда растет время , остановился на CopyFileA потому что самая быстрая.

Dima: PSP пишет: Вот нечто https://www.cyberforum.ru/win-api/thread983172.html писец у нас это сайт заблочен ....придется юзать тор браузер

PSP: А ты вот попробуй перед копированием файл назначения переименовать, а после успешного копирования старый удаляй.

Dima: PSP пишет: А ты вот попробуй перед копированием файл назначения переименовать чёт я не очень понял как переименовать то чего еще нет , так как операция копирования еще не происходила ?

PSP: Dima пишет: чёт я не очень понял как переименовать то чего еще нет , так как операция копирования еще не происходила ? А destination каждый раз новый создается? Или перезаписывается?

Dima: схема такая копирую файлы базы данных в пустую папку затем все скопированные файлы ZIPую , копирую архив на диск где живут бекапы папку куда копировал файлы базы полностью очищаю

PSP: Ясно, но ясности это не добавило



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