Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/08/2013, 04:22
Avatar de guzzano
guzzano
 
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 6 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