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 25-07-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.109
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Sobre las funciones Pos y PosEx en Delphi

Hola,

En cierto programa con el que estoy útilmamente algo liado compuse un componente muy sencillo que permite que se pueda buscar un determinado texto (una determinada cadena) en archivos (así, para qué iba a quedarme corto, total).

Es el caso que en un momento dado utilizo la función "Pos" de Delphi, que, justamente, devuelve la posición de una determinada cadena en un texto dado, objetivo fundamental del componente susomentado.

Lo que me preocupa es lo siguiente:

Código Delphi [-]
            j := Pos(FTextoABuscar, archivo.Text);
Donde "j" es una variable de tipo integer que guardará el resultado de la función "Pos"; "FTextoABuscar" es la cadena que se trata de encontrar... y "archivo" es una variable de tipo "TStringsList" mediante cuya propiedad "Text" obtenemos ya el texto contenido en un determinado archivo en el que buscar la cadena de marras.

Mi preocupación pasa porque el texto en donde buscar puede ser considerable, teniendo en cuenta que el componente "buscador" que he tomado por solución no es muy inteligente (cómo iba a serlo) y no discrimina archivos de menos de 5 MB, por ejemplo, y permite buscar en todo tipo de archivos, aun cuando en realidad no sepa qué hacer con algunos de ellos, o para qué los quiere, si no va a saber procesarlos correctamente.

Yo creo que se me entiende: ¿Hay alguna forma mejor y más razonable, eficaz, indicada, pertinente, en fin, no que usar la función "Pos" teniendo en cuenta lo que digo, que los archivos pueden ser considerables y, por ende, el texto en el que va a tener que operar dicha función puede ser también considerable, incluso una barbaridad, a mi entender?

A lo mejor es que lo que yo entiendo por barbaridad no lo es tanto. O a lo mejor los tiros van por utilizar la función "PosEx" de Delphi. No les quiero aburrir, pero esta función cuenta con un parámetro más, que, de nombre "OffSet" a mí me parece algo espacial, ¿entienden? Como que pudiera resultar mejor, pero tal vez me equivoque, porque "tantum locus est". Además de que la ayuda de Delphi para las funciones mencionadas es algo así como "y hasta aquí puedo leer..." y me quedo con un palmo de narices.

Termino ya, pero, no quiero dejar de decir algo. ¡Que me preocupa todo lo que he contado, que lo he hecho para ver qué me aconsejan o qué me dicen, pero, en todo caso, el componente no funciona del todo mal, es bastante rápido buscando archivos y texto en ellos, podría incluso decirse que uno está más o menos contento con el resultado! Puesto que comparado con programas de la talla de "Search and Replace" ni remotamente se parecen, claro está, pero los tiempos de búsqueda van ahí, ahí... que no se diferencian en mucho en "benchmark" caseros.

Por cierto, adjunto el archivo ".pas" por si quieren echar un vistazo a este "TBuscadorTextoArchivos" que es el culpable de que halla escrito esto. Además de que ha sido un placer, dirigiéndose a quien va dirigido.

* Nota: Pueden ver el "componente" en funcionamiento en XEditor

* Otra nota: Gracias de antemano y disculpen todo este rollo.

Actualización: he actualizado el archivo adjunto para incluir un mensaje y aun algo más para el usuario en caso de producirse cierta excepción utilizando el componente. Lo noto aquí para que quien lo descargara antes vea que he preferido hacerlo de este otro modo, aprovechando la revisión del componente que he hecho para tratar el tema aquí.
Archivos Adjuntos
Tipo de Archivo: zip UBuscadorTextoArchivos.zip (2,5 KB, 157 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 25-07-2005 a las 23:47:43. Razón: (Actualizar el archivo adjunto)
Responder Con Cita
  #2  
Antiguo 25-07-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
No creo que sea conveniente cargar el archivo en memoria para buscar un fragmento, por otro lado recuedo hace unos años haber bajado unas librerías desarrolladas en Delphi con fuentes para este fin. Te recomiendo buscar en torry.net o en delphipages.com... de uno de estos sitios la tengo que haber bajado!

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 25-07-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.109
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

¿Ni siquiera si en lugar de utilizar una variable de tipo "TStringList" utilizáramos una de tipo "TextFile" o tal vez "TFileStream"? En todo caso miraré por esas librerías que mencionas.

Pero me queda un escrúpulo: ¿porqué no me parece que funcione mal, sino todo lo contrario, o casi? ¿Cómo se debería notar el excesivo consumo de memoria? Tengo entendido que no debo fiarme del administrador de tareas de Windows, puesto que si lo hiciera, en este caso, no noto que se consuma una memoria fuera de lo normal mientras se busca el texto en los archivos... y el uso del procesador es más o menos razonable... (*)

¿Qué problemas, por ende, puede ocasionar el cargar los archivos de esa manera y porqué no se advierte en la ayuda de Delphi sobre algún tipo de limitación en el uso de las funciones "Pos" y "PosEx"? Estas últimas preguntas no van dirigidas a nadie en especial, que conste

(*) ¿Quizás es que en ordenadores menos potentes o con menos memoria pudiera ser una calamidad el consumo de recursos? Mi ordenador es un AMD a 1000 Mhz con 256 MB de memoria RAM. Desde luego no es un Pentium 100...
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 25-07-2005 a las 21:00:52. Razón: (corrección del texto)
Responder Con Cita
  #4  
Antiguo 25-07-2005
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Cita:
Empezado por dec
Hola,
¿Qué problemas, por ende, puede ocasionar el cargar los archivos de esa manera y porqué no se advierte en la ayuda de Delphi sobre algún tipo de limitación en el uso de las funciones "Pos" y "PosEx"? Estas últimas preguntas no van dirigidas a nadie en especial, que conste
El problema que se puede tener es sencillo, como le indiques un archivo muy grande va a reventar todo. Si tienes 256 megas de RAM libres y intentas cargar un archivo de 300 megas no va a caber en la memoria, fallara el programa, y con un poco de mala suerte todo el sistema operativo y resto de programas en ejecucion al quedarse sin memoria para trabajar.
No puedes presuponer que los archivos van a caber en memoria, si alguien sin querer se pone a buscar en una carpeta que este llena de archivos de video, estos seguramente no van a caber en memoria.

En cuanto a que no se indique la limitacion en las funcioes Pos y PosEx, no es algo que se deba indicar porque no es una limitacion de las funciones, es una limitacion de memoria ram simplemente, las funcioes Pos y PosEx funcionaran igual sea cual sea el tamaño del archivo (siempre claro que previamente lo puedas cargar y quepa entero en la memoria).

Saludos
Responder Con Cita
  #5  
Antiguo 25-07-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.109
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Mick
No puedes presuponer que los archivos van a caber en memoria, (...)
Si te fijas en el código que adjunté no se "cargan" archivos de más de 5 MB. Y estoy pensando en reducir la cifra, porque, puesto que se pretende buscar en archivos de texto... ¿cuántos archivos de texto superan los 5 MB de tamaño?

Cita:
Empezado por Mick
(...) es una limitacion de memoria ram simplemente, las funcioes Pos y PosEx funcionaran igual sea cual sea el tamaño del archivo (...)
¿Entonces debo entender que llevando a cabo la limitación susomentada (no cargar archivos de más de 5 MB), y, puesto que la variable que alberga el archivo es liberada cuando ya no es necesaria no tendré demasiados problemas supuesto el caso que se disponga de esos 5 MB de memoria RAM?

Actualización: Dicho y hecho: no se cargarán archivos que superen los 2 MB de tamaño. Considero esta cifra suficiente para lo que se pretende, si bien un tanto a bote pronto.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 25-07-2005 a las 23:38:14. Razón: (corrección del texto)
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


La franja horaria es GMT +2. Ahora son las 17:44:38.


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