Autor
|
Tema: buscar en una gran cantidad de datos (php/txt) (Leído 10,204 veces)
|
nat_chan07
Desconectado
Mensajes: 1
|
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
|
no se si entendí... pero lo guardas en una variable de session y fin del asunto
|
|
|
En línea
|
|
|
|
~ Yoya ~
Wiki
Desconectado
Mensajes: 1.125
|
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
Mensajes: 2.397
JS/Node developer
|
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.. 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
Mensajes: 6.336
he vuelto :)
|
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
|
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
Mensajes: 2.804
|
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 mysql> SELECT * FROM ejemplo; Empty SET (0.00 sec) mysql> LOAD DATA LOCAL INFILE '/home/marian/archivo.txt' INTO TABLE ejemplo FIELDS TERMINATED BY ','; Query OK, 6 ROWS affected (0.00 sec) Records: 6 Deleted: 0 Skipped: 0 Warnings: 0 mysql> SELECT * FROM ejemplo; +---------+-----------+ | nombres | apellidos | +---------+-----------+ | marian | sanchez | | pedro | gomez | | mario | perez | | juana | mejia | | coco | channel | | pepe | lopez | +---------+-----------+ 6 ROWS IN SET (0.00 sec)
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
|
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
Mensajes: 2.804
|
Que crimen... un tipo TEXT para un nombre... 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 (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
Mensajes: 6.336
he vuelto :)
|
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.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
La Gran Cita: cómo aplicar la teoría de los n-cuerpos a los n-datos
Noticias
|
wolfbcn
|
0
|
1,651
|
30 Abril 2013, 17:45 pm
por wolfbcn
|
|
|
El Linux Kernel 3.10.15 LTS llega con una gran cantidad de actualizaciones
Noticias
|
wolfbcn
|
0
|
1,102
|
7 Octubre 2013, 21:31 pm
por wolfbcn
|
|
|
Anonymous filtra una gran cantidad de archivos después de hackear el ...
Noticias
|
wolfbcn
|
0
|
1,353
|
16 Octubre 2013, 13:42 pm
por wolfbcn
|
|
|
Facebook suspende 200 aplicaciones con acceso a gran cantidad de datos
Noticias
|
wolfbcn
|
0
|
1,237
|
14 Mayo 2018, 21:31 pm
por wolfbcn
|
|
|
Kiev dice haber obtenido gran cantidad de datos clasificados en ciberataque contra Rusia
Noticias
|
El_Andaluz
|
0
|
2,523
|
4 Marzo 2024, 22:41 pm
por El_Andaluz
|
|