elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  buscar en una gran cantidad de datos (php/txt)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: buscar en una gran cantidad de datos (php/txt)  (Leído 9,743 veces)
nat_chan07

Desconectado Desconectado

Mensajes: 1


Ver Perfil
buscar en una gran cantidad de datos (php/txt)
« en: 11 Enero 2010, 20:47 pm »

hola
ojalá me puedan ayudar con mi problemita

Lo que pasa es que estoy haciendo un programa que lee unos datos en un archivo de texto y funciona todo perfecto al probarlo con un documento de 4000 lineas del txt (como 700kb) (el cual entero tiene más de 4 millones de lineas y pesa 500mb aprox).

El problema es que cada vez que realizo una busqueda el programa lee todo el txt y da una respuesta y no puedo estar cargando el archivo de 500mb cada vez que quiero buscar 1 numero.

necesito que el documento de texto quede guardado en el buffer o algo y poder realizar busquedas en ese mismo txt varias veces hasta que lo desee cambiar o terminé la "session".


En línea

N4X

Desconectado Desconectado

Mensajes: 74



Ver Perfil WWW
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #1 en: 11 Enero 2010, 20:56 pm »

no se si entendí... pero lo guardas en una variable de session y fin del asunto  :o


En línea

~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 1.125



Ver Perfil
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #2 en: 11 Enero 2010, 22:46 pm »

Ps, creo que no hay otra alternativa, leerá siempre el texto o si tu le especificas una linea para leer solo cuya linea, de lo contrario primero leerá todo y luego hará la búsqueda. Es como un buscador, primero almacena todo y luego devuelve los resultados que coinciden.
En línea

Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.
[u]nsigned


Desconectado Desconectado

Mensajes: 2.397

JS/Node developer


Ver Perfil WWW
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #3 en: 13 Enero 2010, 01:12 am »

Podes usar fgets y leer linea por linea hasta encontrar lo que necesitas extraer de dicho archivo. Pero si este 'scritp' tuyo lo vas a usar en un servidor web.. :P

Yo mejor te diria que busques la forma de pasar tu monstruoso .txt a una BB.DD  :)

Saludos
En línea

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!
Nakp
casi es
Ex-Staff
*
Desconectado Desconectado

Mensajes: 6.336

he vuelto :)


Ver Perfil WWW
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #4 en: 13 Enero 2010, 02:21 am »

si no quieres depender de un servidor para la BBDD usa sqlite que es mas rápido inclusive... u ordena el archivo y usa algún algoritmo de búsqueda como la binaria (solo funciona con un número estático de datos y ordenados, es la mas rápida)
En línea

Ojo por ojo, y el mundo acabará ciego.
WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #5 en: 13 Enero 2010, 03:08 am »

Cuando dices cargar el texto a memoria y esas cosas se me viene a la mente que quieres hacer una especie de caché y cargar una sola ves el texto para no tener que andarlo abriendo a cada rato.
En ese caso puedes almacenar el .txt en un .php donde cada linea es $linea[] = ''; después si quieres buscar algo le haces un foreach y esperar hasta el 2012 para que te resuelva lo que necesitas o inicie el script.

Por defecto en un servidor no puedes cargar todo un archivo de golpe a memoria o a una variable debido a que php tiene una configuración con el limite de memoria permitido para ejecutarse y generalmente no supera los 2mb asi que cuando quieres cargar tu super archivo el loop que vas a hacer con la busqueda te lo va a mandar al carajo.

Lo que tu necesitas es una base de datos como toda la gente que hace trabajos normales, las bases de datos en access y txt son para datos pequeños, mysql, sqlite son para trabajos normales como los que tu quieres.
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #6 en: 13 Enero 2010, 04:28 am »

Pasalo todo a una base de datos, ya que la base de datos posee su propio Buffer cache para manipular data y indices(dependiendo el motor de almacenamiento) el cual puedes manipular su tamanio. Ademas de otras ventajas que haran menos forzosas tantas entradas y salidas del disco de un archivo TXT.

Si tu archivo TXT tiene por ejemplo datos de este estilo:

marian, rodriguez
pedro, gomez
mario, perez
juana, mejia
coco, channel
pepe, lopez

Y tu quieres transportar todo a MySQL por ejemplo, sencillamente creas una tabla para acaparar la informacion anterior, que son nombres y apellidos:

CREATE TABLE ejemplo ( nombres CHAR(15), apellidos CHAR(15))

Y luego a importar :D

Código
  1.  
  2. mysql> SELECT * FROM ejemplo;
  3. Empty SET (0.00 sec)
  4.  
  5. mysql> LOAD DATA LOCAL INFILE '/home/marian/archivo.txt' INTO TABLE ejemplo FIELDS TERMINATED BY ',';
  6. Query OK, 6 ROWS affected (0.00 sec)
  7. Records: 6  Deleted: 0  Skipped: 0  Warnings: 0
  8.  
  9. mysql> SELECT * FROM ejemplo;
  10. +---------+-----------+
  11. | nombres | apellidos |
  12. +---------+-----------+
  13. | marian  |  sanchez  |
  14. | pedro   |  gomez    |
  15. | mario   |  perez    |
  16. | juana   |  mejia    |
  17. | coco    |  channel  |
  18. | pepe    |  lopez    |
  19. +---------+-----------+
  20. 6 ROWS IN SET (0.00 sec)
  21.  
  22.  

Donde FIELDS TERMINATED BY indica donde vas a especificar que se corte la data para pasar la subsiguiente al proximo campo  ;)

Ademas con una DB y datos pasados, podras crear indices , relacionarlos, etc, etc...
En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #7 en: 13 Enero 2010, 05:09 am »

Citar
CREATE TABLE ejemplo ( nombres CHAR(15), apellidos CHAR(15))

Y si tiene un usuario o cliente que se llame
María De las mercedes ozas Riquelme
xDDDD son 20 carácteres, por eso siempre ese tipo de campos para evitar errores y dar mas flexibilidad las declaro de tipo text.
En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #8 en: 13 Enero 2010, 05:35 am »

Que crimen... un tipo TEXT para un nombre...  :rolleyes:  pobre optimizador del motor.

Bueno fijate, puede ocurrir eso que especificas, pero si previamente uno conoce la longitud de algo (nombres, apellidos, telefono, etc) datos alfanumericos, con esto previamente uno puede decidir que tipo de datos utilizar, CHAR solo ocupa 1 byte en memoria por caracter, VARCHAR ocupa 2 bytes por caracter ademas de que este ultimo desfragmenta mucho, TEXT por el otro lado me parece haber leido que es un tipo de dato constante como CHAR (No lo afirmo pero me parece que vi que era asi, lo confirmo manana) Y si esto realmente es asi... eso quiere decir que ya que TEXT soporta 65,400 mas o menos de bytes (cantidad de caracteres maximo en total) y recuerda que TEXT no se le puede indicar hasta que longitud almacenar ya que por defecto el almacena hasta su maxima cantidad (En este caso 65,400 mas o menos) esto quiere decir, que si tu insertas 1 nombre de 20 caracteres.. el te ocupara los bytes restantes (65,380) de ceros (Justo como hace CHAR) que son datos constantes, y si esto realmente es asi, asumo no tendras problemas en que tu datafile crezca masivamente con inserciones simples  :xD (Espero que tengas mucha capacidad de disco duro para este impacto)

Por mas largo que sea un nombre, no superaria los 50 o 60 bytes (nombre no apellido). Me fio de CHAR por ser constante, por no desfragmentarse, y para datas alfanumericas menores que 255 va de lujo. Pero TEXT es un crimen usar TEXT para esos tipos de registros.
En línea

Nakp
casi es
Ex-Staff
*
Desconectado Desconectado

Mensajes: 6.336

he vuelto :)


Ver Perfil WWW
Re: buscar en una gran cantidad de datos (php/txt)
« Respuesta #9 en: 13 Enero 2010, 05:47 am »

Bueno fijate, puede ocurrir eso que especificas, pero si previamente uno conoce la longitud de algo (nombres, apellidos, telefono, etc) datos alfanumericos

no es la primera vez que lo mencionas xD pero me pregunto como sabes la longitud de un nombre u apellido para generalizar?

si defines char(15) por defecto se usarán los 15 bytes aunque ingrese 'a' y varchar usaría la cantidad de letras + 1 byte siempre que la columna no sobrepase los 255 caractéres, así que si usa char(50) o varchar(50) y se introduzca un nombre de 25 caracteres queda mejor parado varchar pues usaría 26 bytes en cambio char usaría los 50
En línea

Ojo por ojo, y el mundo acabará ciego.
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines