Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Busqueda en un array (https://www.clubdelphi.com/foros/showthread.php?t=38821)

jjorell 29-12-2006 22:58:06

Busqueda en un array
 
Hola! Estoy trabajando con un TPlanner en el cual grafico las maquinas de una planta industrial en forma vertical y en la horizontal estan las fechas, en este plano (por llamarlo asi) grafico los lotes de produccion, pero estos deben de estar colocados justamente en una maquina, desde una fecha inicial hasta una fecha final; con la fecha no hay problema, pero debo ubicar la maquina en la que tiene que ser graficado, para esto se asigna la propiedad ItemPos, pero esta no necesariamente coincide con el numero de maquina y he alli mi problema. Como saber a que ItemPos mandar el lote? lo que se me ocurre es que al momento de graficar las maquinas en el plano llenar un array o algo que este solo en memoria y que posteriormente pueda hacer una busqueda de una manera facil y rapida ya que tendria que hacerlo por cada lote y estos seran bastantes :D , en el tendria el IdMaquina y su correspondiente ItemPos.

Pero ahora necesito saber como hacer busquedas de manera eficiente en un arreglo o alguna otra cosa que sea mejor.

Muchas Gracias por su ayuda.

Lepe 30-12-2006 01:04:12

Si aparte de las búsquedas, tienes que insertar, mover elementos del array a otras posiciones y demás, optaría por un TObjectList (busca en el foro).

Si solo es búsquedas secuencial y poco más, con un array de record puede bastar.

Búsquedas eficientes, del estilo que necesitas, no creo que encuentres, a menos que te inventes algo. Por ejemplo, si el idMaquina es un número incremental (sin huecos) puedes hacerlo coincidir con el índice del array, de tal forma que su acceso es inmediato.

El TObjectList dispone de un método Sort (se usa internamente el algoritmo QuickSort) podrías sacarle jugo, no sé.

Deberías concretar un poco más, ¿de cuantos elementos hablamos? ¿Un millon? ¿miles de millones? ¿necesitas capacidad de ordenación? ¿creación dinámica? (que se pueda expandir el tamaño del array sin complicarte la vida)

Saludos

jjorell 30-12-2006 01:52:00

La verdad no necesito hacer mayor cosa que saber en que posicion graficar el Lote de produccion y nada mas.

Por el momento lo he resulto con un array
Código Delphi [-]
TMaquinas = array of array of Integer;

y declaro
Código Delphi [-]
vMaquinas1 :TMaquinas;
y a la hora de cargar las maquinas hago lo siguiente
Código Delphi [-]
   vItemPos:=0;
   SetLength(vMaquinas1,2,NumeMaquinas);
   plMapa.Positions :=NumeMaquinas;
   plMapa.Header.Captions.Clear;
   plMapa.Header.Captions.Add('Maq.');
   while not qTraeCatalogos.Eof do
   begin
          vMaquinas1[0,vItemPos]:=qTraeCatalogos.FieldByName('IdMaquinas').AsInteger;
          vMaquinas1[1,vItemPos]:=vItemPos;
          vItemPos:=vItemPos+1;
          plMapa.Header.Captions.Add('G'+Trim(qTraeCatalogos.FieldByName('Grupo').AsString)+' M'+Trim(qTraeCatalogos.FieldByName('NumRef').AsString));
          qTraeCatalogos.Next;
    end;

para cuando quiero graficar el lote ocupo una funcion que cree para hacer la busqueda en el array
Código Delphi [-]
function TMapaF.fBuscarItemPos(xIdMaquina):Integer;
var xItemPos,j:Integer;
begin
        xItemPos:=-1;
        j:=0;
        while (j=High(vMaquinas1[0])) or (xItemPos<>-1) do
        begin
                if vMaquinas1[0,j] = xIdMaquina then xItemPos:=vMaquinas1[1,j];
                j:=j+1;
        end;
        
        result:=xItemPos;
end;

y el IdMaquina no es incremental, bueno si...pero no grafico todas las maquinas, sino que pueden ser solo un rango cualquiera.

La verdad no son tantos lotes, son aproximadamente 5000 mensuales, el problema que al mantener eso en memoria con aproximadamente 50 usuarios conectados a la vez y graficarlo cada 2 minutos tengo temor de poner lento el sistema. Aunque por el momento no se refleja ni un milisegundo menos, pero en produccion pueda que sea otra historia y quiero estar preparado. ;)

Probare el TObjectList.

Lepe 30-12-2006 13:42:52

Hombre, si ya lo tienes implementado, no veo necesidad de hacerlo de otra forma que no aporta ninguna mejora.

El TObjectList es una lista de objetos en memoria, digamos que podrías sobrecargar un poquitin más el sistema, por la propia creación del objeto.

5.000 elementos multiplicados por 8 bytes (los dos integers) 20.000 bytes divididos entre 1024, da 19 Kb en memoria RAM. Yo lo veo eficiente ;).

No entendí muy bien lo de 50 usuarios y el hecho de que sea 5.000 mensuales. Pero bueno, haz las cuentas tú mismo ;)

(habría que sumar el tamaño del registro y el propio Array, pero vamos que no creo que suba mucho....)

Saludos

jjorell 30-12-2006 22:47:24

Gracias!
 
Lo que sucede que al momento de pedir ayuda, aún no tenia nada :D , pero inmediatamente empece a trabajar en lo que ahora tengo. Por el momento he decidido dejarlo asi ya que creo que no me afecta al rendimiento.

Solo que quiza tratare de economizar recursos por otro lado, ya que viendolo bien no quita velocidad la busqueda sino la graficada de cada lote de produccion ya que cada registro de la base de datos (que representa un lote) tiene que ser graficado y colocada una informacion dentro del recuadro que representa el lote.

Lo que sucede esque es un mapa de produccion (o por lo menos asi le llaman en la empresa que lo estoy desarrollando) el cual permite ver los lotes producidos o a producir en un rango de fechas (la cual puede ser varios dias o hasta meses) y he alli por lo de 5000 lotes por mes.

Lo de los usuarios es porque hay aproximadamente 50 computadoras que se conectan al servidor para tomar datos de la base de datos (la informacion que va dentro del cuadro que representa el lote) y se redibuja automaticamente el mapa cada 2 minutos para tener datos actualizados sin tener que estar presionando un boton de refrescar, esto es porque cada computadora (donde esta el mapa) es vista aprox por 5 o 6 personas. y ha esto le sumamos que hay otros dos mapas para otro tipo de proceso. Al final lo que me preocupa no es tanto la ram, sino la velocidad en que se grafique cuando se vean periodos grandes.

Bueno, gracias por tu ayuda...como te dije antes creo que me funciona bien asi y quizas vere como economizar recursos por otro lado ;) .

Feliz año nuevo.


La franja horaria es GMT +2. Ahora son las 20:33:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi