Форум » [x]Harbour » HBMEMIO » Ответить

HBMEMIO

Dima: Что то я застрял. Вот такой код работает [pre2] REQUEST HB_MEMIO REQUEST DBFCDX PROCEDURE Main() dbCreate( "mem:test", { { "pole", "N", 1, 0 }},,.T.,"tmp" ) index on pole tag "test" close tmp dbDrop( "mem:test" ) dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},,.T.,"tmp" ) index on pole2 tag "test" close tmp dbDrop( "mem:test" ) RETURN [/pre2] Но так как работаю с ADS , код пришлось изменить и он становится не рабочим [pre2] REQUEST HB_MEMIO REQUEST DBFCDX PROCEDURE Main() dbCreate( "mem:test", { { "pole", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole tag "test" close tmp dbDrop( "mem:test" ) dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole2 tag "test" close tmp dbDrop( "mem:test" ) RETURN [/pre2] Как явно указать DBCREATE что юзать нужно именно HBMEMIO ?

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

Dima: Pasha пишет: FErase("mem:test.cdx") возвращает -1 и файл продолжает жить

Dima: Pasha Вот самодостаточный пример [pre2] REQUEST HB_MEMIO REQUEST DBFCDX REQUEST LETO #include "dbinfo.ch" PROCEDURE Main() RDDSETDEFAULT( "LETO" ) dbCreate( "mem:test", { { "pole", "N", 1, 0 },{ "pole22", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole tag test2 index on pole22 tag eeee *Clearmemfile("tmp") close tmp dbdrop("mem:test") Ferase("mem:test.cdx") // до лампочки dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole2 tag test // вот тут мы упадем ;) *Clearmemfile("tmp") close tmp dbdrop("mem:test") RETURN ************* Func Clearmemfile(_alias) local cfile:=(_alias)->(dbinfo(DBI_FULLPATH)) local cindeks:=(_alias)->(dbOrderInfo(DBOI_FULLPATH)) (_alias)->(DbCloseArea()) hb_dbdrop(cfile,cindeks) return nil [/pre2]

SergKis: Dima У меня все OK!.[pre2] FUNCTION TestMemIO() LOCAL cRdd cRdd := RddSetDefault() RddSetDefault("LETO") dbCreate( "mem:test", { { "pole", "N", 1, 0 },{ "pole22", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole tag test2 index on pole22 tag eeee ? alias(),used(),cRdd,RddSetDefault() close tmp dbdrop("mem:test","mem:test","DBFCDX") dbCreate( "mem:test", { { "pole2", "N", 1, 0 }},"DBFCDX",.T.,"tmp" ) index on pole2 tag test // вот тут мы упадем ;) close tmp dbdrop("mem:test","mem:test","DBFCDX") RddSetDefault(cRdd) RETURN [/pre2]


Dima: SergKis пишет: dbdrop("mem:test","mem:test","DBFCDX") Спасибо , мой косяк. Виноват ;)

Pasha: request dbfcdx rddSetDefault('DBFCDX') У меня такой тест работает: dbCreate('mem:test', {{'T1', 'C', 10, 0}}, 'DBFCDX', .t., 'tmp') index on Field->t1 tag test2 ? reccount(), IndexKey() close tmp //dbDrop('mem:test') ? FErase('mem:test.dbf') // 0 ? FErase('mem:test.cdx') // 0 У тебя не сработал FErase из-за того, что файл уже удален вызовом dbDrop. Хотя неясно, если dbDrop удаляет индекс, откуда он появляется вновь ?

Dima: Pasha Косяк мой был в том что mem: базу создавал через DBFCDX А в DBROP , RDD не указывал в то время как умалчиваемым RDD был ADSCDX или Leto как в примере. Делал так Dbdrop("mem:test") А надо было Dbdrop("mem:test",,"DBFCDX") и тогда убивается и база и индекс. Накосячил я ;)

Dima: Pasha пишет: request dbfcdx rddSetDefault('DBFCDX') У меня такой тест работает: Сделай rddSetDefault('LETO') и тогда Ferase вернет -1

Pasha: Dima пишет: А надо было Dbdrop("mem:test",,"DBFCDX") и тогда убивается и база и индекс. Да, выходит эти команды вызываются вне контекста рабочей области, и поэтому rdd приходится для них указывать напрямую, если по умолчанию используется другой.

Andrey: Вопрос по ускорению расчётов по DBF Имею большую базу 350 Мб, по ней раз в неделю идут расчёты. Есть ли смысл эту базу записать в "mem:", сделать расчёты, а потом перезаписать обратно на диск ? Будет ли при этом ускорение при расчётах ?

SergKis: Если она поместится в память Для ускорения можно ключевые и если надо поля для фильтров класть в mem:, делать на них scope, filter и связывать с осн. базой, считать. У тебя база не большая, а широкая, колонки по годам, вот можешь в mem: переносить только колонки года, считать, брать другого года колонки в mem:. снова считать ..., причем колонки в мем: называешь без цифр года - получаешь универсальный расчсет. PS. Для mem: можешь создавать из структуры базы, структуру в в mem: только одного года, append from .. переносить данные и считать, что быстрее пробуй. То же можешь сделать и с REQUEST SQLMIX, rddSetDefault( "SQLMIX" ) есть примеры

Andrey: SergKis пишет: вот можешь в mem: переносить только колонки года, считать, брать другого года колонки в mem:. снова считать ..., причем колонки в мем: называешь без цифр года - получаешь универсальный расчсет. Нет, это база одного года, по каждому абоненту. Кол-во абонентов соответствует кол-ву записей в базе. Правда 1/5 часть базы можно не считать, абоненты ушли. Я хочу целиком базу записать в "mem:", не разбираться считать или не считать эту запись.

PSP: Andrey пишет: Я хочу целиком базу записать в "mem:", не разбираться считать или не считать эту запись Для начала надо выяснить, сколько времени будет занимать перенос диск->память --- память->диск. Может выяснится, что овчинка выделки не стОит. И таки да, памяти может не хватить и будет BSOD

Dima: Andrey пишет: Вопрос по ускорению расчётов по DBF Пересмотри алгоритм в плане оптимизации

PSP: Dima пишет: Пересмотри алгоритм в плане оптимизации +1 Может даже в отдельный поток вынести. Пусть себе считает.

Andrey: PSP пишет: Для начала надо выяснить, сколько времени будет занимать перенос диск->память --- память->диск. Может выяснится, что овчинка выделки не стОит. И таки да, памяти может не хватить и будет BSOD Сделал небольшой тест на МиниГуи. [pre2]#define _HMG_OUTLOG REQUEST DBFCDX, DBFFPT, HB_MEMIO REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_CODEPAGE_UTF8 #include "hmg.ch" /////////////////////////////////////////////////////////////////////////// PROCEDURE MAIN LOCAL cFile, cFile2, cMsg, tTime, nSize, nSize2 SET WINDOW MAIN OFF cFile := GetStartupFolder() + "\Abon2023.dbf" cFile2 := "mem:" + cFileNoPath( cFile ) // create/open in memory via HB_MEMIO tTime := HB_DATETIME() nSize := hb_vfSize(cFile) / 1024 / 1024 hb_vfCopyFile( cFile, cFile2 ) nSize2 := hb_vfSize(cFile2) / 1024 / 1024 wApi_Sleep( 100 ) cMsg := 'Файл успешно скопирован !;;' cMsg += cFile + ' - Размер файла: ' cMsg += HB_NtoS(nSize) + ' Мбайт; =======>>>>>> ;' cMsg += cFile2 + ' - Размер файла: ' cMsg += HB_NtoS(nSize2) + ' Мбайт;;' cMsg += "Затрачено времени " + HMG_TimeMS( tTime ) ? AtRepl( ";", cMsg, CRLF ) ? Repl("-._.",19) + Repl(CRLF,20) HB_vfErase(cFile2) // delete after use wApi_Sleep( 100 ) cMsg := HB_MemoRead( _SetGetLogFile() ) AlertInfo( cMsg, "Program operation log" ) RETURN[/pre2] Вот результат: [pre2]Файл успешно скопирован ! D:\TEMP\1Test\Abon2023.dbf - Размер файла: 321.66 Мбайт =======>>>>>> mem:Abon2023.dbf - Размер файла: 321.66 Мбайт Затрачено времени 00:00:00.461 [/pre2] Видно нужно всё таки сделать расчёт по базе в памяти !

PSP: Andrey пишет: Сделал небольшой тест на МиниГуи. Это - с диска в память. А обратно? А индексы при расчете используются? Где они будут? Видно нужно всё таки сделать расчёт по базе в памяти ! Попробуй)

Andrey: PSP пишет: Это - с диска в память. А обратно? А обратно такое же время будет. [pre2]D:\TEMP\1Test\Abon2023.dbf - Размер файла: 321.66 Мбайт =======>>>>>> mem:Abon2023.dbf - Размер файла: 321.66 Мбайт =======>>>>>> D:\TEMP\1Test\newAbon2023.dbf - Размер файла: 321.66 Мбайт Затрачено времени 00:00:00.748 [/pre2]

SergKis: Andrey пишет Видно нужно всё таки сделать расчёт по базе в памяти ! Попробуй на PC с малой памятью (когда там excel, chrom запущен), открой как dbf, создай индекс с тэгами, по бегай по базе, потом говори "ГОП"

Dima: SergKis пишет: Попробуй на PC с малой памятью (когда там excel, chrom запущен), открой как dbf, создай индекс с тэгами, по бегай по базе, потом говори "ГОП" +1

PSP: Andrey пишет: А обратно такое же время будет. Не буду отговаривать))



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