Página 1 de 1

Qué es mejor en memoria: ¿arreglo o lectura de archivo?

NotaPublicado: 2011-08-18 15:04 @670
por SistemaJP
Quisiera encontrar una respuesta y sé que este es el lugar indicado para preguntar, (soy miniperl, ¡je,je! llevo poco).

Supongamos que tengo un @array1 con 10 archivos y otro @array2 100 archivos.

De los 10 en @array1 pueden o no estar en @array2 (resuelto)
Ejemplo:
@array1: abc.txt, dre.txt, edu.txt, xxx.txt
@array2: set.txt ere.txt abc.txt, dre.txt, yui.txt


Ya tengo el archivo a comparar si existe en los dos arrays (ejemplo: abc.txt y dre.txt)

Lo que necesito es leer línea por línea a partir de X línea (un patrón if($str_line1 =~ /^\s*\$INPUT/) ) y ver si hay diferencias en los archivos.

¿Qué es mejor?

1.- Abrir mi arreglo de esta manera e ir línea por línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (AFILE,"$name_cws_ogn");
  2. $. = 0;
  3. while (<AFILE>)
  4. {
  5.     chomp($str_line1 = $_);
  6.  
  7.     # aquí abrir el otro archivo y comparar línea por línea
  8. }
  9. close(AFILE);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


2.- O hacer esto en los dos archivos y manejarlos como arreglos y entonces comparar línea por línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open FILE, "+<", "$name_cws_ogn" or die $!;
  2.         @lines = <FILE>;
  3. close (FILE);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Qué es más rápido y mejor para la memoria? Los array pueden contener desde 1 a 1000 archivos (el caso más grande que he visto) y cada archivo tiene de 100 a 700 líneas o más...

De antemano, gracias por su ayuda y su tiempo en leer este caso...

Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?

NotaPublicado: 2011-08-18 19:26 @851
por explorer
Cada acceso a disco conlleva una serie de operaciones.

Llamadas desde la aplicación al sistema operativo, para solicitar acceso a una determinada posición dentro de un fichero abierto. El sistema operativo debe comprobar si puede servir el contenido pedido a partir de la información almacenada en los búfer temporales. Si no, debe lanzar más llamadas, a más bajo nivel, para dialogar con el controlador del sistema de ficheros para solicitar acceso al fichero. El sistema de ficheros debe comprobar que el fichero todavía existe visible para el sistema (la unidad física no se ha desmontado del sistema principal). Si es el caso, hará llamadas al controlador de hardware para solicitar los sectores de disco correspondientes a la posición que la aplicación requiere, leer unos cuántos de esos sectores, devolverlos al sistema de ficheros, que actualizará la información referente a la fecha de último acceso en lectura al fichero (con lo que se traduce en escrituras al disco), y devuelve los sectores leídos al sistema operativo, que los guardará en los búfer, y de donde sacará la línea que el cliente solicita, recordando además, la posición del puntero de lectura, para la próxima lectura (si la desea el usuario, claro).

Bueno, todo eso ocurre por cada llamada, desde nuestro programa, para leer una sola línea de un fichero. Gracias al uso de los búfer, y a los sistemas caché de los discos, y al sistema de pre-caché multisectorial, también de los discos, se ahorran muchas llamadas al hardware (acceso directo al disco duro). Pero no deja de ser un montón de llamadas entre varios sistemas, dentro del ordenador.

Por eso, si sabemos que tenemos que procesar todo el contenido de un fichero, y la información de ese fichero cabe en memoria, yo soy partidario de leerlo completamente en memoria, ya que entonces el número de operaciones con el disco se reduce a leerlo una sola vez.

Los procesadores actuales, y su acceso a memoria RAM, suelen ser de más de un orden de magnitud más altos que los accesos a disco (excepto con los actuales discos SDD que están reduciendo esa diferencia).

700.000 líneas son muchas líneas, pero, lo interesante es saber la longitud media por línea, o ver el total de lo que ocupa el fichero en el disco, para saber, aprox. si cabe todo en memoria.

Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?

NotaPublicado: 2011-08-18 21:52 @953
por SistemaJP
Grandioso, explorer... Vaya que me has enseñado bastante y aparte lo he casi entendido todo =P.

Ok, bueno, mañana adjuntaré un archivo o los archivos. En cada línea no exceden de más de 100 caracteres por línea.

Y cuento con una z400 y 4 Gb de RAM...

Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?

NotaPublicado: 2011-08-20 04:25 @225
por pvaldes
Compruébalo tu mismo...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Benchmark qw(:all) ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Perldoc Benchmark

No hay nada como la propia experiencia,

Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?

NotaPublicado: 2011-08-20 12:02 @543
por explorer
Con solo esa línea, poco puede hacer ;)

Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?

NotaPublicado: 2011-08-20 14:33 @648
por pvaldes
Hombre, puede investigar... :mrgreen:

Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?

NotaPublicado: 2011-08-25 12:14 @551
por SistemaJP
Por supuesto... como era para fines prácticos hice esto, aunque las sorpresas con Benchmark son muchas :D


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Benchmark;
  2.  
  3. $tiempo_inicial = new Benchmark;
  4. $start = time();
  5.  
  6. # ¡Código!
  7.  
  8. $end = time();
  9. $tiempo_final = new Benchmark;
  10. $tiempo_total = timediff($tiempo_final, $tiempo_inicial);
  11. print "Performance:",timestr($tiempo_total),"\n";
  12. chomp($SimpleTime = $end - $start);
  13. print "Time taken was ", ($SimpleTime), " seconds";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Muchas gracias por el consejo, explorer, me has ayudado a identificar cómo puedo optimizar mi código...