• Publicidad

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

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

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

Notapor SistemaJP » 2011-08-18 15:04 @670

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.002 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...
SistemaJP
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-08-17 12:30 @562

Publicidad

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

Notapor explorer » 2011-08-18 19:26 @851

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

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

Notapor SistemaJP » 2011-08-18 21:52 @953

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...
SistemaJP
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-08-17 12:30 @562

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

Notapor pvaldes » 2011-08-20 04:25 @225

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,
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

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

Notapor explorer » 2011-08-20 12:02 @543

Con solo esa línea, poco puede hacer ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

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

Notapor pvaldes » 2011-08-20 14:33 @648

Hombre, puede investigar... :mrgreen:
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

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

Notapor SistemaJP » 2011-08-25 12:14 @551

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...
SistemaJP
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-08-17 12:30 @562


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron