Of course, thanks for your opinion!
I also think it is due to disk.

Regards

Qatan escribió:
> Hello Rafa,
>
>    I am not sure, may be wrong but I would say also that the fisical
> access of the HD Head divided in different threads would increase the
> time to access the same ammount of data compared to only one thread.
>    This is due to the fisical comings and goings of the Head over the
> disk surface.
>    I don't know for SDD but maybe it would have a similar effect
> because multi threading would not be an advantage for disk access,
> only for CPU.
>
> Qatan
>
>
> ----- Original Message ----- From: "rafa" <r...@tesipro.com>
> To: "Harbour Project Main Developer List." <harbour@harbour-project.org>
> Sent: Monday, 10 de May de 2010 06:20
> Subject: [Harbour] Slow create index under threads
>
>
>> Hello,
>> I'm trying to do a re indexing using threads, but according to tests
>> under Windows Vista,
>> Quarda Intel Core, 4 Gig RAM, the tests are not entirely satisfactory;
>>
>> The basic idea was to determine the number of threads that want to
>> implement,
>> N_THREADS, which is passed by parameter, for testing purposes.
>>
>> Well, times;
>> 1 thread    = 29 minutes THE WINNER!
>> 4 threads  = 93 minutes WoW!
>> 7 threads  = 68 minutes
>> 5 Threads = 64 minutes
>>
>> Something to do this by penalizing Harbour indexing, or the code above,
>> you have
>> thing excessively penalized.
>>
>> ---------------- SPANISH -------------------------------------------
>> Hola,
>>
>> Estoy intentando hacer una re indexación usando hilos, pero según
>> pruebas bajo Windows Vista,
>> Intel Quard Core, 4 Gigas RAM, los test no son del todo satisfactorios;
>>
>> La idea básica es determinar la cantidad de hilos que queremos poner en
>> marcha,
>> N_THREADS, que es pasado por parámetro, para poder realizar pruebas.
>>
>> Pues bien, los tiempos ;
>> 1 Hilo = 29 minutos  THE WINNER!
>> 4 Hilos = 93 minutos WoW!!
>> 7 hilos = 68 minutos
>> 5 Hilos = 64 minutos
>>
>> Algo hacer Harbour que esta penalizando la indexación, o el código
>> expuesto, tiene alguna
>> cosa que penaliza en exceso.
>>
>> Cualquier comentario es bienvenido para mejorar este aspecto.
>>
>> //---------------------------------------------- source code
>> ----------------------------------------------------------
>> /*
>>   Example multiThreads index.
>>   One thread by table , and one thread by index.
>>   2010 Rafa Carmona
>>
>>   Thread Main
>>        |--------->  table for test.dbf
>>        |                        |----> Thread child index fname
>>        |                        |
>>        |                        |----->Thread child index fcode
>>
>>   c:\> ..\..\bin\win\bcc\hbmk2 -mt indexthread -lhbcpage
>> -Le:\harbour\trunk\harbour\lib\win\bcc
>>
>>   New code, now, if thread dead, new thread create!
>>
>> */
>> #include "hbclass.ch"
>> #include "hbthread.ch"
>> #include "common.ch"
>> #include "inkey.ch"
>> #include "FileIO.ch"
>>
>> REQUEST HB_CODEPAGE_ES850, HB_CODEPAGE_ES850C
>> REQUEST HB_LANG_ES
>>
>> static N_THREADS := 5
>>
>> STATIC nTecla
>> STATIC s_num_procesos
>> STATIC s_aLineas := {  }
>> static s_hMutex
>> static s_hHandle_File
>> static s_nCount_Errores := 0
>>
>> proc Main( nHilos )
>>    Local nSeconds
>>    Local cDbf, lProcesa := .F.
>>    Local aFicheros, x
>>    Local aDbfs, aNtxs, aKeys , aDesc, aFor, aSel
>>    Local aThreads := {}
>>    Local nProceso := 0, nLinea, lSalir := .F., nIndex
>>    Local nLen_Table
>>    Local nPosTable, cCadena, cLine, aTokens, i
>>    Local nPos_Column  := 1, g
>>
>>
>>    DEFAULT nHilos     TO 0
>>
>>    if !empty( nHilos )
>>        N_THREADS := val( nHilos )
>>    endif
>>
>>     //HB_SetCodePage( "ES850" ) En xHarbour
>>    set( _SET_CODEPAGE, "ES850C" )
>>
>>    HB_LANGSELECT('ES')
>>    Set( _SET_LANGUAGE, "ES" )
>>
>>
>>    setmode( 25,130 )
>>    cls
>>
>>    @01,0 SAY padc( hb_ansitooem( "  Indexación multihilo. Rafa Carmona"
>> ), 80 )COLOR "N*/W*"
>>    @23,0 SAY padc( "Pulse ESC para cancelar." , 80) COLOR "R+/N"
>>
>>   // ONLY for TEST, if necesary many many DBF , with millions records
>> for test.
>>  // My test is over 200 dbfs, with 12GB total size, without NTX.
>>   aDbfs := { "test", "test2" } // Arrays files dbf
>>
>>    aNtxs := { { "fname", "fcode" },; // files index for test
>>                      { "fName2" } } // files index for test2
>>
>>    aKeys := { { "name", "code" },;
>>                      { "dtos(fecha)+str(code)" } } // Expresions
>>
>>    aFor  :=  { { "", ""}, {""} }
>>
>>
>>    nLen_Table := len( aDbfs )
>>    nPosTable  := 1
>>    nSeconds := Seconds()
>>    s_num_procesos := 0
>>    s_hMutex := hb_mutexCreate()
>>    s_hHandle_File := FCreate( "indexpms.log" )
>>
>>    for g := 1 to N_THREADS  // Posicion en la columa por cada numero de
>> hilo
>>       aadd( s_aLineas, nPos_Column )
>>        nPos_Column += 16
>>    next
>>
>>
>>     while nPosTable <= nLen_Table
>>
>>        if ( nTecla := inkey() ) = K_ESC
>>           exit
>>        endif
>>
>>        if N_THREADS = s_num_procesos // No se ha muerto ningun proceso
>>          loop
>>        endif
>>
>>        cDbf := aDbfs[ nPosTable ]
>>
>>
>>        if  file( cDbf+".dbf" )
>>           hb_mutexLock( s_hMutex )
>>           s_num_procesos++
>>           hb_mutexUnLock( s_hMutex )
>>           hb_threadStart( @aCreateIndexe(), cDbf, aNtxs[ nPosTable ],
>> aKeys[ nPosTable ], aFor[ nPosTable ]  )
>>        endif
>>
>>        nPosTable++
>>    end while
>>
>>  @23,1 SAY "Espere, terminado reindexaciones pendientes..." + space( 50
>> ) COLOR "R*/N"
>>  hb_threadWaitForAll() // Esperamos a los ultimos.
>>  @23,1 SAY "Proceso de indexacion terminado..." + Str( (Seconds() -
>> nSeconds) /60 ) + space( 50 ) COLOR "W+/N"
>>
>>  FClose( s_hHandle_File )
>>
>> return
>>
>>
>> function aCreateIndexe( cFile, aNtx, aExpr, aFor )
>>       Local nContador := 1
>>       Local cFileNtx, cExpr
>>       Local aThreads := {}
>>       Local cAlias, cFor
>>       Local  nP, x, oError, lreturn := .f.
>>
>>       use ( cFile )
>>       if neterr()
>>          hb_mutexLock( s_hMutex )
>>          s_num_procesos--
>>          s_nCount_Errores++
>>          hb_mutexUnLock( s_hMutex )
>>          @22,1 SAY "[ "+ alltrim( str( s_nCount_Errores ))+" ] Error de
>> apertura en el fichero : "+ cFile + space( 10 )
>>          fwrite( s_hHandle_File, "Error de apertura en el fichero : "+
>> cFile + Hb_OsNewline() )
>>          return nil
>>       endif
>>
>>       cAlias := alias()
>>       hb_dbDetach( cAlias )  // Libero el alias
>>
>>       for x := 1 to len( s_aLineas )
>>          nPosLinea := s_aLineas[ x ]
>>          if !empty( nPosLinea )
>>              s_aLineas[x] := 0  // Quita del array esa linea disponible
>> para pintar
>>              exit
>>          endif
>>       next
>>
>>       @ 2, nPosLinea CLEAR TO 15, nPosLinea + 14 // Limpiamos cuadrado
>>       hb_dispOutAt( 2, nPosLinea , cFile )
>>
>>       for each cFileNtx in aNtx
>>           cExpr  := aExpr[ cFileNtx:__enumindex ]
>>           cFor   := aFor[ cFileNtx:__enumindex ]
>>           nPos   := cFileNtx:__enumindex
>>           delete file ( cFileNtx +".ntx")  // Se borra el fichero, por
>> ahorro de espacio en disco.
>>           aadd( aThreads, hb_threadStart( @crea(), cAlias,cExpr,
>> cFileNtx, cFor, nPos, nPosLinea ) )
>>           if ( nTecla := inkey() ) = K_ESC  // No protegemos variable
>> static
>>              exit
>>           endif
>>       next
>>
>>       aEval( aThreads, { |x| hb_threadJoin( x ) } )  // Espera que
>> termine los hilos hijos
>>
>>       hb_dbRequest( cAlias, , , .T.)  // Restaura el alias
>>       close
>>
>>       // Vuelve a colocar la linea como disponible para pintar
>>       s_aLineas[x] := nPosLinea
>>       hb_mutexLock( s_hMutex )
>>       s_num_procesos--
>>       hb_mutexUnLock( s_hMutex )
>>
>> RETURN .T.
>>
>> proc crea( cAlias, cExpr, cFileNtx, cFor, nPos, nPosLinea )
>>      Local nContador := 1
>>
>>       hb_dbRequest( cAlias, , , .T.)  // Restaura el alias
>>       if empty( cfor )
>>           INDEX ON &(cExpr) TO &(cFileNtx) ;
>>                 EVAL {|| hb_dispOutAt( nPos +3, nPosLinea, padr(
>> cFileNtx,8 )+ "-"+alltrim( hb_valtostr( nContador) ), "GR+/N" ),
>> nContador += INT( LASTREC() / 100 ) , .T. } ;
>>                 EVERY INT( LASTREC() / 100 )
>> //                 EVAL {|| hb_dispOutAt( nPos +2, nPosLinea, padr(
>> cFileNtx,8 )+ "-"+ padr( cExpr,20)+ " # " +alltrim( hb_valtostr(
>> nContador) ), "GR+/N" ), nContador += INT( LASTREC() / 100 ) , .T. } ;
>>       else
>>           INDEX ON &(cExpr) TO &(cFileNtx) FOR &(cFor) ;
>>                 EVAL {|| hb_dispOutAt( nPos +3, nPosLinea, padr(
>> cFileNtx,8 )+ "-"+alltrim( hb_valtostr( nContador) ), "GR+/N" ),
>> nContador += INT( LASTREC() / 100 ) , .T. } ;
>>                 EVERY INT( LASTREC() / 100 )
>>       endif
>>       hb_dbDetach( cAlias )          // Libera el alias
>>
>>
>> return
>> _______________________________________________
>> Harbour mailing list (attachment size limit: 40KB)
>> Harbour@harbour-project.org
>> http://lists.harbour-project.org/mailman/listinfo/harbour 
>
> _______________________________________________
> Harbour mailing list (attachment size limit: 40KB)
> Harbour@harbour-project.org
> http://lists.harbour-project.org/mailman/listinfo/harbour
>
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to