Foros del Web » Programando para Internet » PHP »

if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string] ?

Estas en el tema de if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string] ? en el foro de PHP en Foros del Web. Hola es más rápido buscar [CADENA_DE_TEXTO] entre los nombres de los files del dir [NOMBRES] abrir el file [NOMBRES] y buscar línea por línea [CADENA_DE_TEXTO] ...
  #1 (permalink)  
Antiguo 14/02/2014, 15:22
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string] ?

Hola

es más rápido
  • buscar [CADENA_DE_TEXTO] entre los nombres de los files del dir [NOMBRES]
  • abrir el file [NOMBRES] y buscar línea por línea [CADENA_DE_TEXTO]

???

Lo más "inteligente" sería guardar [CADENA_DE_TEXTO] en una tabla MySQL y hacer un select from NOMBRES where...

pero con BD = mucho cósto computacional.

Requiero lo más velóz/liviano que exista, dado que se hara la busqueda unas 500, 900 véces POR SEGUNDO !!!

Pero no durante HORAS, sino por unos... 15 minutos.

Les agradezco la aclaración/orientación/documentación que puedan compartirme.

:)
  #2 (permalink)  
Antiguo 14/02/2014, 18:12
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

¿y de dónde sacas la idea de que el usar una bd es mucho costo computacional? considerando que si usas índices correctamente los motores de bases de datos optimizan mucho las consultas, es obvio que sería más rápido que buscar secuencialmente en un directorio o en el contenido de un archivo.
  #3 (permalink)  
Antiguo 14/02/2014, 20:44
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Cita:
Iniciado por ocp001a Ver Mensaje
...es obvio que sería más rápido que buscar secuencialmente en un directorio o en el contenido de un archivo.
Ni es obvio ni es mas rápido, ni es correcto lo que dices.
  #4 (permalink)  
Antiguo 14/02/2014, 21:36
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años
Puntos: 34
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Esos inventos raros nunca acaban bien. Si existen las bases de datos es para algo. Te apuesto lo que tu quieras que si tienes 500 mil archivos y yo tengo 500 mil registros en una tabla yo puedo encontrar el string que sea en un registro mucho antes que tu usando el filesystem.
  #5 (permalink)  
Antiguo 15/02/2014, 02:56
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Cita:
Iniciado por patriciomase Ver Mensaje
Si existen las bases de datos es para algo.
Sí, para obtener gran cantidad de info a partir de gran cantidad de datos...

Lo cuál optimiza, acelera, y preserva la información.

Ese no es el caso aquí.
  #6 (permalink)  
Antiguo 15/02/2014, 12:31
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Bueno, si no indicas todos los detalles como la cantidad de datos a buscar, entonces pretendes que se te de un consejo adivinando las características de tu proyecto.
  #7 (permalink)  
Antiguo 15/02/2014, 13:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Cita:
pero con BD = mucho cósto computacional.
Me encantaría entender de dónde sacaste semejante idea. En serio.
He leido extravagancias referidas a BBDD y busqueda de datos, pero esa es nueva.

Cita:
Requiero lo más velóz/liviano que exista, dado que se hara la busqueda unas 500, 900 véces POR SEGUNDO !!!

Pero no durante HORAS, sino por unos... 15 minutos.
Buscar una cadena de texto indexada en una columna, de una tabla que contenga, digamos, unos 300 millones de registros, en una base de datos con una estructura de 960 tablas lleva al DBMS... unos 0,015 segundos por las experiencias que he tenido.
¿De dónde sacaste lo de horas?

¿De veras crees que acceder al filesystem, considerando todo el overhead generado al barrer los directorios, o bien el overhead agregado en los cambios de contexto de la lectura de archivos, es una buena idea?
Usar cualquier DBMS, incluyendo el peor de todos, es más rápido que eso.

Cita:
Sí, para obtener gran cantidad de info a partir de gran cantidad de datos...
La verdad me estás dejando algo asombrado.
Parece que tienes muchos prejuicios, o has usado incorrectamente las BBDD y por ende sacado conclusiones equivocadas.

De todos modos, como te dicen, si no explicas mejor el contexto de tu proyecto, es difícil darte un consejo adecuado de lo que te conviene hacer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 15/02/2014, 18:35
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿De dónde sacaste lo de horas?
La búsqueda será generada por cientos durante algunos minutos, no durante horas.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
¿De veras crees que acceder al filesystem, considerando todo el overhead generado al barrer los directorios, o bien el overhead agregado en los cambios de contexto de la lectura de archivos, es una buena idea?
¿al buscar en una tabla MySQL (archivo) no se pasa por el filesystem?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La verdad me estás dejando algo asombrado.


Cita:
Iniciado por gnzsoloyo Ver Mensaje
si no explicas mejor el contexto de tu proyecto, es difícil darte un consejo adecuado
determinar si existe el stringX en un conjunto de strings.

Ya con la sugerencia de hacerlo por medio de BD, debo adicionar una nueva opción a mi pregunta:

...es más rápido

  • buscar [CADENA_DE_TEXTO] entre los nombres de los files del dir [NOMBRES]
  • abrir el file [NOMBRES] y buscar línea por línea [CADENA_DE_TEXTO]
  • buscar [CADENA_DE_TEXTO] en una tabla MySQL
???

Solo debe determinarse si NO existe, en cuyo caso se agrega al conjunto.

La consulta será realizada solo UNA VÉZ, pero cuándo se realice, la consulta la realizaran simultáneamente unas 900 véces por segundo durante no mas de 12 minutos.

Gracias.
  #9 (permalink)  
Antiguo 15/02/2014, 18:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Cita:
¿al buscar en una tabla MySQL (archivo) no se pasa por el filesystem?
Sólo para acceder al index. Y los accesos a datos son muchísimo más rápidos en una BBDD, por la simple razón de que se diseñaron optimizados para esa tarea.

Buscar una cadena sobre una columna indexada puede requerir a lo más tres accesos a disco, y la lectura de tres bloques de datos de 8 Kb, máximo. Y verificar solamente si existe... bueno, creo que con un acceso a disco alcanza.
El overhead en ese caso es insignificante.

Además, el conjunto de strings se puede validar en un único paso en SQL.

Leer los archivos de disco... bueno, eso ocupa muchísimo más tiempo de procesador.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 15/02/2014, 18:56
Avatar de arcanisgk122  
Fecha de Ingreso: junio-2010
Mensajes: 755
Antigüedad: 13 años, 11 meses
Puntos: 28
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

ok respondo a tu post y solicitud:

10 euros por el costo computacional de 15 minutos que requieres... y 500 por mi esfuerso si quieres el script terminado y corriendo... digo no hay que tener cojones para llegar y pedir algo de tus huevos sin nisiquiera Exponer lo que te afecta en tu trabajo... que creo que no tenias nada hecho... ya que no es un problema ni de logica ni de costo computacional si no de ganas de aprender y hacerlo por uno mismo...


Adicional a los colegas... para poder ayudarte necesitamos lo siguiente:

Codigo que estas implementando y no te funciona...
error que te envia... y no te deja funcionar...
si necesitas consultar por php archivos de texto en un servidor X necesitamos saber el formato y caracteristicas de los texto,
la idea de la base de datos es almacenar los String que vayas a utilisar, no los archivos asi al correr el script PHP toma el texto rapido de una base de datos, lo verifica en todos los archivos y te genera por pantallla si lo encontro o no.
creo que la limitante no es el escript mas bien seria la velocidad del disco duro para abrir el archivo, hacer la lectura de cada string o cadena y cerrar...

ya que si fuera por uso de procesador o ram te aseguro que mi pentium 4 lee 330MB de texto plano en 1 segundo...

entendiste ??
__________________
Cooler Master Gladiator 600 - AMD PHENOM II X4 955 @ 3.5GHZ
GA-MA78GM-US2H - Super Talent 800 2GB x 2 Dual, (Unganged)
PSU Cooler Master eXtreme Power Plus 500W - Saphire R7-260OC-2GB

Última edición por arcanisgk122; 15/02/2014 a las 19:04
  #11 (permalink)  
Antiguo 15/02/2014, 19:26
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Leer los archivos de disco... bueno, eso ocupa muchísimo más tiempo de procesador.
Y menos que

1 abrir fileX
2 buscar en sus líneas la existencia de stringX

?
  #12 (permalink)  
Antiguo 15/02/2014, 19:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Probablemente, según el caso, abrir un archivo y buscar dentro de su contenido tarde tanto o más que barrer el sistema de archivos para buscar uno.
Pregunta: ¿Tienes claro a qué me refiero cuando hablo de overhead? ¿Y que este afecta mucho los dos caso que preguntabas al principio?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 15/02/2014, 19:53
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Cita:
Iniciado por gnzsoloyo Ver Mensaje
según el caso, abrir un archivo y buscar dentro de su contenido tarde tanto o más que barrer el sistema de archivos para buscar uno.
Oh...
Pero esa es EXACTAMENTE la razón por la que pregunté en FDW.

Ahí me estas regresando AL comienzo del POST...

Sin embargo,
la solución más velóz es: tabla indexada de MySQL.

true ?
  #14 (permalink)  
Antiguo 15/02/2014, 19:59
Avatar de arcanisgk122  
Fecha de Ingreso: junio-2010
Mensajes: 755
Antigüedad: 13 años, 11 meses
Puntos: 28
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Respuesta rápida: haslo como mejor te parezca pero no notaras la diferencia. al menos que sea un trabajo para un datacenter con 15 mil archivos y cada uno tiene uno pese 1 tera....
__________________
Cooler Master Gladiator 600 - AMD PHENOM II X4 955 @ 3.5GHZ
GA-MA78GM-US2H - Super Talent 800 2GB x 2 Dual, (Unganged)
PSU Cooler Master eXtreme Power Plus 500W - Saphire R7-260OC-2GB
  #15 (permalink)  
Antiguo 15/02/2014, 21:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Cita:
Iniciado por Anarko Ver Mensaje
Oh...
Pero esa es EXACTAMENTE la razón por la que pregunté en FDW.

Ahí me estas regresando AL comienzo del POST...

Sin embargo,
la solución más velóz es: tabla indexada de MySQL.

true ?
Pues la respuesta la tienes haciendo el siguiente razonamiento: Si acceder a archivos fuese más eficiente, no existirían las bases de datos.

Tablas, indices, etc., son siempre mejor opción que leer archivos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 16/02/2014, 04:42
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 2 meses
Puntos: 22
Respuesta: if(file_exists(nombre)) ó leer file(X) en MATRÍZ y buscar EN ELLA [string]

Gracias Gnzsoloyo.
Cita:
Iniciado por gnzsoloyo Ver Mensaje
Tablas, indices, etc., son siempre mejor opción que leer archivos.
.

Generar

una var para clave+user
otra para ID de conexión
otra para el QUERY
otra para el resultado
una mas para ordenar el result MYSQL_FETCH_ARRAY()...
no sé cuantas mas para no se que del motor BD
cerrar conexión...

Solo para validar la existencia de un string en un conjunto de strings...

A primer vista parece más velóz leer fileX
O bien leer el archivo/tabla que lista los archivos del dirX

Pero si VARIOS expertos en FDW dicen que lo + velóz (dado que se trata de un string) es utilizar BD, os agradezco la paciencia que habeis tenido.

Etiquetas: mysql, select, string, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:13.