Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 29-12-2006
Avatar de jjorell
jjorell jjorell is offline
Miembro
 
Registrado: jun 2006
Posts: 22
Poder: 0
jjorell Va por buen camino
Exclamation 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 , 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.

Última edición por jjorell fecha: 29-12-2006 a las 23:15:51.
Responder Con Cita
  #2  
Antiguo 30-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 30-12-2006
Avatar de jjorell
jjorell jjorell is offline
Miembro
 
Registrado: jun 2006
Posts: 22
Poder: 0
jjorell Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 30-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 30-12-2006
Avatar de jjorell
jjorell jjorell is offline
Miembro
 
Registrado: jun 2006
Posts: 22
Poder: 0
jjorell Va por buen camino
Thumbs up Gracias!

Lo que sucede que al momento de pedir ayuda, aún no tenia nada , 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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
BMP en un array lacatella Gráficos 2 27-07-2006 20:36:27
Array con Bitmaps a GIF o AVI [Gunman] Gráficos 3 27-06-2006 17:41:12
Perdido en un array Xianto Varios 4 22-04-2005 19:30:50
Como Asignar Variable Tipo Array de Tform a otro Array del Mismo tipo morfeo21 Varios 5 17-08-2004 17:39:51
Array esquerda21 Varios 7 26-02-2004 19:27:21


La franja horaria es GMT +2. Ahora son las 01:20:55.


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
Copyright 1996-2007 Club Delphi