Sample acceleration

This forum is for eXpress++ general support.
Post Reply
Message
Author
User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Sample acceleration

#1 Post by Eugene Lutsenko »

I have 3 databases, one main (Obi_Zag) and 2 connected with main the relation "one to many" (Obi_Kcl, Obi_Kpr). Key field: Kod_Obj. I choose the Abs databases given for formation from the connected databases:

Code: Select all

SELECT Obi_Zag
DBGOTOP()
DO WHILE .NOT. EOF()                // Начало цикла по анкетам обучающей выборки

   Mess = "Расчет абс. частот    - ABS  - Обработка #/$ объекта обуч.выборки"
   Mess = STRTRAN(Mess,"#", ALLTRIM(STR(++Time_progress,15)))
   Mess = STRTRAN(Mess,"$", ALLTRIM(STR(N_Obj,15)))
   oSay1:SetCaption(Mess)

   M_KodObj = Kod_Obj               // Код объекта обучающей выборки

   // Формирование массива кодов классов текущего объекта обучающей выборки
   Ar_Kcl := {}
   SELECT Obi_Kcl
   SET FILTER TO M_KodObj = Kod_Obj
   DBGOTOP();DBGOBOTTOM();DBGOTOP()
   DO WHILE .NOT. EOF()             // Начало цикла по записям БД кодов классов текущего объекта
      FOR j=2 TO 5
          M_Kcl = FIELDGET(j)
          IF VALTYPE(M_Kcl) = "N"
             IF 0 < M_Kcl .AND. M_Kcl <= N_Cls
                AADD(Ar_Kcl, M_Kcl)
             ENDIF
          ENDIF
      NEXT
      DBSKIP(1)
   ENDDO

   // Формирование массива кодов признаков текущего объекта обучающей выборки
   Ar_Kpr := {}
   SELECT Obi_Kpr
   SET FILTER TO M_KodObj = Kod_Obj
   DBGOTOP();DBGOBOTTOM();DBGOTOP()
   DO WHILE .NOT. EOF()             // Начало цикла по записям БД кодов признаков текущего объекта
      FOR j=2 TO 8
          M_Kpr = FIELDGET(j)
          IF VALTYPE(M_Kpr) = "N"
             IF 0 < M_Kpr .AND. M_Kpr <= N_Gos
                AADD(Ar_Kpr, M_Kpr)
             ENDIF
          ENDIF
      NEXT
      DBSKIP(1)
   ENDDO

   // Суммирование 1 в ячейки БД Abs.dbf, соотвествующие строкам и столбцам,
   // а также в строку и столбец "Сумма" и строку: Кол-во объектов по классам"

   SELECT Abs
   FOR i=1 TO LEN(Ar_Kpr)
       DBGOTO(Ar_Kpr[i])
       For j=1 TO LEN(Ar_Kcl)
           FIELDPUT(2+Ar_Kcl[j], FIELDGET(2+Ar_Kcl[j])+1)            // Ячейка [i,j]++
           Ar_SummaNj[2+Ar_Kcl[j]] = Ar_SummaNj[2+Ar_Kcl[j]] + 1     // Строка "Сумма абс.частот"
           Ar_SummaNi[Ar_Kpr[i]] = Ar_SummaNi[Ar_Kpr[i]] + 1         // Столбец "Сумма абс.частот" по строкам
           Summa_Nij++                                               // Сумма Nij по всей БД Abs.dbf
       NEXT
   NEXT
   For j=1 TO LEN(Ar_Kcl)
       Ar_SummaObj[2+Ar_Kcl[j]] = Ar_SummaObj[2+Ar_Kcl[j]] + 1       // Строка "Сумма числа объектов по классам"
       Summa_Obj++                                                   // Сумма Obj по всей БД Abs.dbf
   NEXT

   lOk = Time_Progress (Time_progress, Wsego, oProgress, lOk )

   SELECT Obi_Zag
   DBSKIP(1)
ENDDO
However a sample of data in an example with the given code goes extremely slowly. Whether it is impossible to accelerate this process essentially? There can be this result the relation organization "can give one to many"? But I couldn't organize it, though looked examples from xdemo.exe. But there examples for the dialogue organization are given. It at me turned out. And for calculations I couldn't make it. Can be eat any filter based not on LOOK, and on DBSEEK on an index, or even on DBGOTO ()?

skiman
Posts: 1185
Joined: Thu Jan 28, 2010 1:22 am
Location: Sijsele, Belgium
Contact:

Re: Sample acceleration

#2 Post by skiman »

Hi,

Never use a filter in this case.

Create an index on the two files with your key field.

Alias2->(dbseek(....))
do while alias->field == alias2->field
..
alias2->(dbskip(1))
enddo

Also take a look at dc_scope.
Best regards,

Chris.
www.aboservice.be

User avatar
RDalzell
Posts: 205
Joined: Thu Jan 28, 2010 6:57 am
Location: Alsip, Illinois USA

Re: Sample acceleration

#3 Post by RDalzell »

Another example of one-to-many (browse) is Roger's XSample_130() using as Chris stated scopes and additionally codeblocks.

Rick

User avatar
Eugene Lutsenko
Posts: 1649
Joined: Sat Feb 04, 2012 2:23 am
Location: Russia, Southern federal district, city of Krasnodar
Contact:

Re: Sample acceleration

#4 Post by Eugene Lutsenko »

Made with index array instead of the filter. Began on base in 20000 records instead of 8 hours to work 4 minutes:

Code: Select all

SELECT Obi_Zag
SET ORDER TO 1
DBGOTOP()
DO WHILE .NOT. EOF()                // Начало цикла по анкетам обучающей выборки

   Mess = "Расчет абс. частот    - ABS  - Обработка #/$ объекта обуч.выборки"
   Mess = STRTRAN(Mess,"#", ALLTRIM(STR(++Time_progress,15)))
   Mess = STRTRAN(Mess,"$", ALLTRIM(STR(N_Obj,15)))
   oSay1:SetCaption(Mess)

   M_Recno  = RECNO()
   M_KodObj = Kod_Obj                  // Код объекта обучающей выборки

   // Формирование массива кодов признаков текущего объекта обучающей выборки
   SELECT Obi_Kpr;SET ORDER TO 1;T=DBSEEK(STR(M_KodObj,15))
   IF T
      Ar_Kpr := {}
      DO WHILE M_KodObj = Kod_Obj .AND. .NOT. EOF()             // Начало цикла по записям БД кодов классов текущего объекта
         FOR j=2 TO 8
             M_Kpr = FIELDGET(j)
             IF VALTYPE(M_Kpr) = "N"
                IF 0 < M_Kpr .AND. M_Kpr <= N_Gos
                   AADD(Ar_Kpr, M_Kpr)
                ENDIF
             ENDIF
         NEXT
         DBSKIP(1)
      ENDDO
   ENDIF

   // Формирование массива кодов классов текущего объекта обучающей выборки
   SELECT Obi_Kcl;SET ORDER TO 1;T=DBSEEK(STR(M_KodObj,15))
   IF T
      Ar_Kcl := {}
      DO WHILE M_KodObj = Kod_Obj .AND. .NOT. EOF()             // Начало цикла по записям БД кодов классов текущего объекта
         FOR j=2 TO 5
             M_Kcl = FIELDGET(j)
             IF VALTYPE(M_Kcl) = "N"
                IF 0 < M_Kcl .AND. M_Kcl <= N_Cls
                   AADD(Ar_Kcl, M_Kcl)
                ENDIF
             ENDIF
         NEXT
         DBSKIP(1)
      ENDDO
   ENDIF

   // Суммирование 1 в ячейки БД Abs.dbf, соотвествующие строкам и столбцам,
   // а также в строку и столбец "Сумма" и строку: Кол-во объектов по классам"

   IF LEN(Ar_Kcl) > 0 .AND. LEN(Ar_Kpr) > 0
      SELECT Abs
      FOR i=1 TO LEN(Ar_Kpr)
          DBGOTO(Ar_Kpr[i])
          For j=1 TO LEN(Ar_Kcl)
              FIELDPUT(2+Ar_Kcl[j], FIELDGET(2+Ar_Kcl[j])+1)            // Ячейка [i,j]++
              Ar_SummaNj[2+Ar_Kcl[j]] = Ar_SummaNj[2+Ar_Kcl[j]] + 1     // Строка "Сумма абс.частот"
              Ar_SummaNi[Ar_Kpr[i]] = Ar_SummaNi[Ar_Kpr[i]] + 1         // Столбец "Сумма абс.частот" по строкам
              Summa_Nij++                                               // Сумма Nij по всей БД Abs.dbf
          NEXT
      NEXT
      For j=1 TO LEN(Ar_Kcl)
          Ar_SummaObj[2+Ar_Kcl[j]] = Ar_SummaObj[2+Ar_Kcl[j]] + 1       // Строка "Сумма числа объектов по классам"
          Summa_Obj++                                                   // Сумма Obj по всей БД Abs.dbf
      NEXT
   ENDIF

   lOk = Time_Progress (Time_progress, Wsego, oProgress, lOk )

   SELECT Obi_zag
   DBGOTO(M_Recno)
   DBSKIP(1)
ENDDO

Post Reply