Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Qué es mejor en memoria: ¿arreglo o lectura de archivo? Responder al tema
Nuevo tema


Página 1 de 1  [ 7 mensajes ] 
 
Nota 2011-08-18 15:04 @670

Perlero Nuevo
Registrado: 2011-08-17 12:30 @562
Mensajes: 5
Qué es mejor en memoria: ¿arreglo o lectura de archivo?
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:
Syntax: [ Download ] [ Hide ]
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);


2.- O hacer esto en los dos archivos y manejarlos como arreglos y entonces comparar línea por línea:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. open FILE, "+<", "$name_cws_ogn" or die $!;
  2.         @lines = <FILE>;
  3. close (FILE);


¿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...


Nota 2011-08-18 19:26 @851
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?
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


Nota 2011-08-18 21:52 @953

Perlero Nuevo
Registrado: 2011-08-17 12:30 @562
Mensajes: 5
Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?
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...


Nota 2011-08-20 04:25 @225

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?
Compruébalo tu mismo...

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use Benchmark qw(:all) ;


Perldoc Benchmark

No hay nada como la propia experiencia,


Nota 2011-08-20 12:02 @543
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?
Con solo esa línea, poco puede hacer ;)

_________________
JF^D Perl programming


Nota 2011-08-20 14:33 @648

Perlero Frecuente
Registrado: 2011-01-22 12:56 @580
Mensajes: 118
Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?
Hombre, puede investigar... :mrgreen:


Nota 2011-08-25 12:14 @551

Perlero Nuevo
Registrado: 2011-08-17 12:30 @562
Mensajes: 5
Re: Qué es mejor en memoria: ¿arreglo o lectura de archivo?
Por supuesto... como era para fines prácticos hice esto, aunque las sorpresas con Benchmark son muchas :D


Syntax: [ Download ] [ Hide ]
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";



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


Responder al tema  [ 7 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO