Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lectura de archivos grandes, rápido.

Estas en el tema de Lectura de archivos grandes, rápido. en el foro de C/C++ en Foros del Web. Buenos días, tengo una pregunta es más una curiosidad para próximos proyecto que una utilidad para este momento. Supongamos, tengo un archivo de 8MB que ...
  #1 (permalink)  
Antiguo 21/08/2013, 04:22
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 7 meses
Puntos: 13
Lectura de archivos grandes, rápido.

Buenos días, tengo una pregunta es más una curiosidad para próximos proyecto que una utilidad para este momento. Supongamos, tengo un archivo de 8MB que tiene más de 178870 líneas, que está compuesta por esta sintaxis

Código C:
Ver original
  1. alsa-lib
  2. 1.0.26-1
  3. usr/
  4. usr/bin/
  5. usr/bin/aserver
  6. usr/include/
  7. usr/include/alsa/
  8. usr/include/alsa/alisp.h
  9. usr/include/alsa/asoundef.h
  10. usr/include/alsa/asoundlib.h
  11. usr/include/alsa/conf.h
  12. usr/include/alsa/control.h
  13. usr/include/alsa/control_external.h
  14. usr/include/alsa/error.h
  15. usr/include/alsa/global.h
  16. usr/include/alsa/hwdep.h
  17. usr/include/alsa/iatomic.h
  18. ... sigue aún más paquetes y más directorios

La cual de ahí, necesito comparar el nombre del paquete, que en este caso sería alsa-lib con una lista, por ende, hará varías veces la comprobación en ese archivo.

Y hago la comprobación de esta manera,
Código C:
Ver original
  1. int
  2. pkg_is_installed (const char * n_pkg, int lenght, int show) {
  3.   if (lenght <= 0 || strnlen(n_pkg, lenght) <= 0)
  4.     return -1;
  5.  
  6.   char buffer[lenght];
  7.   char pkg_fix[lenght];
  8.  
  9.   int len;
  10.  
  11.   len = snprintf(pkg_fix, sizeof(pkg_fix)-2, "%s\n", n_pkg);
  12.  
  13.   if (len <= 0)
  14.     return -1;
  15.  
  16.   FILE * db;
  17.  
  18.   db = fopen(DB_DIR, "r");
  19.  
  20.   if (db == NULL) {
  21.     fprintf(
  22.       stderr,
  23.       "pkgrmd >> Error opening «%s»: %s\n",
  24.       DB_DIR,
  25.       strerror(errno)
  26.     );
  27.    
  28.     return -1;
  29.   }
  30.  
  31.   while (fgets(buffer, sizeof(buffer), db) != NULL)
  32.     if (strcmp(buffer, pkg_fix) == 0) {
  33.       fclose(db);
  34.    
  35.       return 0;
  36.     }
  37.      
  38.   fclose(db);
  39.  
  40.   if (show == 1)
  41.     fprintf(
  42.       stderr,
  43.       "pkgrmd >> The package «%s» is not installed\n",
  44.       n_pkg
  45.     );
  46.  
  47.   return -1;
  48. }

Como tengo que hacer un muchas comprobaciones (> 1000), se vuelve muy lento el programa, llegando a durar más de un minuto en un Core 2 Duo, ¿hay alguna sugerencia para éste tipo de casos?

Estaba pensando pasar al principio del programa todo los paquetes de ese archivo a una lista enlazada para que no tener que abrir el archivo cada vez, no sé que pensarás ustedes, así creo que sería más rápido, porque todas las comprobaciones ocurren en la memoria.

Muchas gracias, y saludos.

Última edición por guzzano; 21/08/2013 a las 04:30
  #2 (permalink)  
Antiguo 21/08/2013, 04:50
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 13 años, 11 meses
Puntos: 228
Respuesta: Lectura de archivos grandes, rápido.

Efectivamente, lo recomendable es que leas una sola vez el archivo. Y si quieres algun mas velocidad implemente una tabla hash o algun otro estructura mas optima que una lista enlazada.

Saludos
  #3 (permalink)  
Antiguo 21/08/2013, 05:05
Avatar de guzzano  
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 13 años, 7 meses
Puntos: 13
Respuesta: Lectura de archivos grandes, rápido.

Cita:
Iniciado por sam90 Ver Mensaje
Efectivamente, lo recomendable es que leas una sola vez el archivo. Y si quieres algun mas velocidad implemente una tabla hash o algun otro estructura mas optima que una lista enlazada.

Saludos
Muchas gracias por tu respuesta Sam, tienes algún tipo de documentación sobre esas "tabla hash" que desconozco.

Un saludo.
  #4 (permalink)  
Antiguo 21/08/2013, 05:29
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 8 meses
Puntos: 28
Respuesta: Lectura de archivos grandes, rápido.

Lo ideal esque guardes todos los paquetes en la memoria (quitando las lineas en blanco y los comentarios). Después los ordenas alfabéticamente y implementes una busqueda binaria.

Etiquetas: grandes, int, lectura, programa
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 22:00.