Форум » Clipper » Copy File to и работа с базой » Ответить

Copy File to и работа с базой

Dima: Есть сетевая база работающая под ADS. Работа с базой идет весьма интенсивная с разных рабочих станций. Примерно раз в час программа на Harbour копирует эту базу командой copy file to для последующей архивации. Пока база была не большая глюков не было. Сегодня в ряде баз кол-во записей перевалило за полтора лимона. Иногда происходят странные вещи и мне кажется что глюки появляются в тот момент когда идет копирование базы. Так например может заглючить DBseek() , другого объяснения не нашел. Есть промежуточный документ с кодами товара , на основании этого документа создается накладная. Кол-во товарных позиций в промежуточном документе и накладной должно совпадать. Как правило все нормально , но бывают случаи когда это не так. Алгоритм переноса достаточно простой и глюков там нет. Сумбурно как то я все обрисовал , но думаю мысль ясна ;)

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

Сыроежка: Я сомневаюсь, что dbseek может работать некорректно. Разве что программист может некорректно использовать эту функцию. например, работа зависит от второго параметра SoftSeek. Если параметр не задан, то действует текущая установка Set для SoftSeek. А так трудно в общих чертах судить, что вызывает некорректное копирование. Может быть в конце копирования просто проверять, что число записей совпадает с числом записей, вычисленных на основе исходных позиций документов? И на основании этого уже делать какие-то выводы.

Pasha: Дима, непонятно, как команда copy file to может работать совместно с ads. copy file to aka __CopyFile это не функция rdd, она работает через файловые операции, а поскольку ads открывает файлы монопольно, работать не может. Может быть, ты делаешь как-то по-другому ? В любом случае, копировать открытую ads таблицу лучше средствами ads, функцией AdsCopyTable()

Dima: Pasha Ты наверное имел в виду установку AdsLocking( .t. ) , но она ни коим образом не блочит работу __CopyFile. При такой установке базу нельзя открыть с RDD отличным от ADSCDX в Clipper а уже тем более в Foxpro или Excel


Dima: Pasha пишет: В любом случае, копировать открытую ads таблицу лучше средствами ads, функцией AdsCopyTable() Поюзал эту функцию. Работает быстрее в 5 раз по сравнению с __CopyFile. Это хорошо , но есть минус при таком подходе. Архив базы в этом случае останется на сервере Netware а хотелось бы иметь на локальной станции. Можно конечно этот архив скопировать на локальную станцию , но все мы знаем что копирование жрет много ресурсов и порядком нагрузит винт сервера Netware что приведет к заметным тормозам при работе с базами в программе. Покопал Advantage CA-Clipper Guide Vers 5.0 и обнаружил команду COPY TO ARRAY ака функция aofCopyToArray, если предположить что она так же шустро работает как и AdsCopyTable() то наверное это было нормальным решением. Базу в массив (разумеется под Harbour ) а массив уже не дергая сервер Newtare конвертнуть в локальную базу. НО в RDDADS (Harbour) такой функции я не увидел. Копнул HELP к ADS и там нет. Куда же она делась то ?

Pasha: AdsCopyTable работает быстрее __CopyFile понятно почему. Первая копирует файл на сервере, а вторая - через сеть, поэтому получается медленнее. Я давно не имел дела с Nwtware. Есть ли под нетварь какой-нибуть архиватор в виде nlm ? Если есть, то лучше всего было бы настроить архивацию копии Базы, полученной вызовами AdsCopyTable по времени прямо на сервере, и затем готовый архив забирать с клиента. DBF архивируется очень хорошо, процентов на 90, так что такое копирование займет немного ресурсов. А с массивами лучше не связываться. Думаю, что харбор захлебнется на массивах размерностью в миллионы элементов. Я и с Ads давно дело не имел. Мне почему-то по памяти казалось, что он хватает базу монопольно. В всяком случае, ads под windows вроде бы так работал. Но и остается непонятной первоначальная проблема, как простое копирование через файловые операции может привеодить к глюкам. Скажем, при доступе чепез seek может быть блокировка индекса. Но при копировании индекс никак не затрагивается, да и блокировок никаких не выполняется, так что помешать работе ads ничто не может.

Dima: Pasha пишет: AdsCopyTable работает быстрее __CopyFile понятно почему. Первая копирует файл на сервере, а вторая - через сеть, поэтому получается медленнее. я не совсем верно выразился , в качестве эксперимента __CopyFile делал тоже на сервере , но AdsCopyTable все равно оказался в разы быстрее. Пробовал так же средствами ADSCDX копировать базы , но все равно победил AdsCopyTable PS Еще игрался с RAM дисками и __CopyFile , по времени примерно тоже что AdsCopyTable получилось

Pasha: Dima пишет: я не совсем верно выразился , в качестве эксперимента __CopyFile делал тоже на сервере , но AdsCopyTable все равно оказался в разы быстрее. Так харбора для netware же не существует. Наверное, ты запускал программу с win-клиента ? Тогда __CopyFile два раза испозьзует передачу данных по сети: для чтения и записи файла, а AdsCopyTable работает локально на netware. Ну да ладно, я не об этом. Раз уж ads под netware позволяет другим программам открывать открытые им файлы, то такой программой может быть и архиватор. Например, вот этот: http://www.nwsoft.ru/ru/programs/nwzip/ А затем созданный им архив можно забирать с клиента. Правда, при этом остается вопрос, не помешает ли чтение архиватором файла работе самого ads. Но этот вопрос будет стоять в любом случае, чем бы не копировать базу.

Dima: Pasha пишет: Наверное, ты запускал программу с win-клиента Конечно ;) Nwzip я конечно и сам нашел , только не понятно как его запускать в нужные моменты. Ведь это можно сделать руками с консоли сервера только. По ходу я говорил что игрался с RAM дисками для копирования. Скорость сопоставима с AdsCopyTable , и скорее всего именно на этом варианте и остановимся. Создаем RAM диск гига на два и туда тулим архив базы с помощью __CopyFile , там же и архивируем. Архив ложим локально куда нужно. Как вариант можно копироваться на SSD носитель. Прог для создания RAM дисков из оперативки , полно , в том числе и бесплатных. Юзал пока 2 из них. Скорость копирования оказалась одинаковой. Остановился пока на http://ramdisk.nm.ru/ramdiskent-rus.htm

Pasha: Dima пишет: Nwzip я конечно и сам нашел , только не понятно как его запускать в нужные моменты. Есть для этих целей cron: http://www.novell.com/coolsolutions/feature/7174.html

Dima: Pasha пишет: Есть для этих целей cron Спасибо

Dima: Pasha Как ты думаешь что лучше использовать для архивации прямо на серере NWZIP (под Netware) или HB_ZIPFILE (Harbour) ? Удобнее конечно HB_ZIPFILE , но не будет ли он сильно грузить HDD сервера по сравнению с NWZIP ?!

Pasha: Если nwzip нормально работает и его удастся настроить, то лучше использовать его. Думается, что hdd сервера оба варианта загрузят одинаково: архивация (так должно быть) - это чтение исходного файла в один проход, собственно архивация и запись результата Но hb_zip помимо всего этого нагружает сеть, так как исходный(е) файл(ы) считываются по сети. Локальный вариант (nwzip) всегда предпочтительнее.

Dima: Pasha Спасибо , буду думать дальше.

Dima: Подумал и потестил. AdsCopyTable и NWZIP вариант конечно идеальный да и сеть не грузит. Но проблема с CRON , он слишком прост и тупо запускает задачи по времени. А на чем пишут NLM для Netware ? Нужна простейшая программа , которая проверяет наличие в нужной папке нужного файла , если есть файлик то запускается NWZIP а дальше дело техники и ни чего сложного не вижу.

Pasha: Dima пишет: А на чем пишут NLM для Netware ? Нужна простейшая программа , которая проверяет наличие в нужной папке нужного файла , если есть файлик то запускается NWZIP а дальше дело техники и ни чего сложного не вижу. Я под netware никогда не программировал, но по идее можно использовать такую простую программу на C: [pre] #include <dir.h> #include <stdlib.h> main() { struct ffblk ffblk; if( findfirst( "myarc.zip", &ffblk, 0 ) == 0 ) /* файл существует */ system( "nwzip.nlm param" ); }[/pre] Собрать ее можно попробовать с помощью OpenWatcom C compiler, который поддерживает netware: http://www.openwatcom.org/index.php/Main_Page Более того, там есть кроссплатформенная сборка, т.е. под windows можно собирать программы для netware А вот как собирать - надо разбираться

Pasha: Можно поспрашивать на форумах netware, как это сделать попроще Может быть, можно обойтись каким-то батником

Dima: Pasha Спасибо , буду копать.

Dima: Нашел тулзу счас чекану http://www.lenik.ru/netwarends/srvcontr/index.shtml ЗЫ Пашет однако !!!

Dima: Вот уж не думал что можно выполнить NLM на консоли сервера с рабочей станции минуя REMOTE CONSOLE. Однако nlmload.exe это позволяет. Завтра буду плотно переписывать процесс копирования баз и архивирование. План действий примерно таков: AdsCopyTable Затем с помощью nlmload.exe запускаю NWZIP с параметрами , после окончания его работы (это еще предстоит выяснить когда он окончит работу но думаю решаемо) копирую архив на локальный диск и чищу папку на серваке с копией и архивом. Pasha Спасибо за идеи и подсказки и просто за внимание !!!

Dima: Все сделал как надо. Всем спасибо !

Dima: Dima пишет: Все сделал как надо А по факту что то не то вышло ;) У меня база 835 метров и AdsCopyTable скопировал ее за 1 минуту 20 секунд У клиента база 1 гиг и AdsCopyTable скопировал ее за 9 минут Железо на серверах примерно одинаковое. Не пойму почему такая большая разница. Может файервол что то блочит..... Пока не пойму куда копать. Пробовал играться с AdsCacheRecords , разницы в скорости не увидел.

Pasha: Операцию AdsCopyTable выполняет сам Ads. Возможно, у тебя он не выполнял больше никаких действий, только одну операцию, а у клиента отвлекался на другие запросы. Конечно, там поддерживается многопоточность, но тут надо смотреть, сколько ядер на процессоре, сколько создано потоков. Файервол тут точно ни при чем, так как ace с клиента дал команду серверу AdsCopyTable, и сервер ее выполняет уже без обращения к сети. В любом случае, вряд ли копирование можно сделать быстрее другим способом.

Dima: Pasha пишет: Возможно, у тебя он не выполнял больше никаких действий, только одну операцию, а у клиента отвлекался на другие запросы Я тоже так подумал. Рабочих станций юзающих базу порядка 30. Что касается потоков то настраивал их согласно доке к ADS , cобственно стоит сейчас 16

Dima: Pasha А ты когда юзал ADS , это были все версии под Netware или под Windows тоже ?

Pasha: Под netware до 2000 года, потом под windows Сейчас полностью отказался от ads

Dima: Pasha А под виндой когда юзал то по какому протоколу ?

Pasha: С клиппером по ipx, а с харбором естественно по ip



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