• Viernes 8 de Noviembre de 2024, 23:02

Autor Tema:  Lectura De Cadenas Eficiente En C O C++  (Leído 895 veces)

chapapott

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Lectura De Cadenas Eficiente En C O C++
« en: Viernes 21 de Abril de 2006, 18:15 »
0
Hola, estoy implementando un algoritmo sobre grafos de talla muy grande, alrededor de varios millones de aristas (p. ej. 5*10^6). Un grafo viene representado en un fichero de texto donde las aristas se representan en la forma:

"cadena_origen"|"cadena_destino"|entero

siendo "cadena_origen" y "cadena_destino" el nombre de los nodos inicial y final de la arista (dichos nombres pueden contener caracteres, espacios y numeros). entero es el peso de la arista. Actualmente leo estas aristas de la siguiente manera:

Código: Text
  1.  
  2.  
  3.  while (fd.getline(cad, TAM)) {
  4.  istringstream fichlin(cad);
  5.  fichlin.getline(node1, TAM, '|');
  6.  fichlin.getline(node2, TAM, '|');
  7.  fichlin >> Peso;
  8.  //procesar node1, node2 y Peso...
  9.  }
  10.  
  11.  
  12.  

El problema es que tarda demasiado, alrededor de 30 s. en mi máquina, la ejecución de este bucle, con lo cual la entrada misma de los datos del problema supone más tiempo que la aplicación del algoritmo posterior.

Me gustaría saber si hay alguna forma más eficiente de hacer esta misma operación de lectura de cadenas, ya sea en C o en C++ y aunque conlleve una pérdida de claridad, con la que poder reducir el tiempo de ejecución del programa.

Muchísimas gracias a todos de antemano!

Un saludo
----------------------------------------------------

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Lectura De Cadenas Eficiente En C O C++
« Respuesta #1 en: Viernes 21 de Abril de 2006, 19:16 »
0
supongo que con fopen, almacenando todo el archivo en un buffer de chars y recorriendo el buffer va a ser todo mas rapido.

haces

FILE * fd = fopen( "archivo" , "r" );

int tamano = fseek( fd , 0 , SEEK_END );
fseek( fd , 0 , SEEKK_SET );
char * buffer;
buffer = ( char * ) malloc( sizeof( char ) * tamano );
fread( buffer , tamano , 1 , fd );

fclose( fd );

aho cargaste el archivo al buffer.
despues de eso lee los datos del buffer que va a ser mas rapido.

PD el codigo no lo probe porque no estoy en mi casa pero supongo que funciona