• Publicidad

Limpiar caché en Perl

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Limpiar caché en Perl

Notapor Hardtechno44 » 2011-06-07 17:14 @760

Hola, estoy desarrollando un programa en perl bajo Linux (Ubuntu) para leer distintos archivos guardados en un CD-rom.

Cada archivo puede ser leído varias veces en la ejecución del programa, pero cuando un mismo archivo es leído más de una vez, dicha lectura no se realiza desde el CD, si no que lo lee directamente desde la caché. Yo necesito hacer todas las lecturas desde el CD para que los datos pasén a través del bus ATA/IDE.

He probado con el comando:
sudo echo 3 | sudo tee /proc/sys/vm/drop_caches

y ejecutado en la shell funciona, pero al integrarlo en el programa Perl de la siguiente manera no funciona:
sudo echo 1 | sudo tee "/proc/sys/vm/drop_caches";

Necesitaría poder limpiar la cache de alguna manera, bien mediante este comando o de cualquier otra forma.

Gracias por su ayuda.
Hardtechno44
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-06-07 17:00 @750

Publicidad

Re: Limpiar caché en Perl

Notapor explorer » 2011-06-07 18:28 @811

Bienvenido a los foros de Perl en español, Hardtechno44.

Lo he conseguido poniéndolo de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. system('sudo sh -c "sync; echo 3 > /proc/sys/vm/drop_caches"');
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

  • Como usuario, tengo permiso de ejecutar sudo.
  • Dentro de sudo, pido ejecutar sh (bash).
  • El bash lo ejecuta con la opción -c, que indica que la cadena que sigue la debe interpretar como un script.
  • Bash ejecuta primero el comando sync, para asegurarnos de que todos los caché de escritura, pasen a disco.
  • Y luego, manda '3' al fichero virtual del kernel, borrando todos los caché.

Esta es otra manera, sin comillas dobles, pero escapando el significado de ';' y '>':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. system('sudo sh -c sync\; echo 3 \> /proc/sys/vm/drop_caches');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Limpiar caché en Perl

Notapor Hardtechno44 » 2011-06-07 19:09 @839

Hola, he probado a añadir la línea que me has indicado, no da ningún error, pero no consigue borrar la caché como cuando introduzco directamente el comando en la shell y cuando un documento se lee por segunda vez, se toma de la caché.

Te envío el código del programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/bin/perl
  2.  
  3. # Versión 1.0
  4. # 7/06/2011
  5.  
  6. system('sudo sh -c sync\; echo 3 \> /proc/sys/vm/drop_caches');
  7.  
  8. # La matriz recoge la información leída del archivo nombrado en la línea de comandos
  9. @archivo = <>;
  10.  
  11. foreach $Partitura (@archivo) {
  12.  
  13.     # Separamos el archivo leído buscando los espacios entre notas.
  14.     @notas = split( " ", $Partitura );
  15.     $CantidadNotas = scalar(@notas);
  16.  
  17.     for ( $i = 0; $i < $CantidadNotas; $i++ ) {
  18.  
  19.         if ( @notas[$i] =~ /do/ ) {
  20.  
  21.             open( DATOS, "/media/PrácticasCarrera/Do.txt" );
  22.             while (<DATOS>) {
  23.             }
  24.         }
  25.         if ( @notas[$i] =~ /re/ ) {
  26.  
  27.             open( DATOS, "/media/PrácticasCarrera/Re.txt" );
  28.             while (<DATOS>) {
  29.             }
  30.         }
  31.         if ( @notas[$i] =~ /mi/ ) {
  32.  
  33.             open( DATOS, "/media/PrácticasCarrera/Mi.txt" );
  34.             while (<DATOS>) {
  35.             }
  36.         }
  37.         if ( @notas[$i] =~ /fa/ ) {
  38.             open( DATOS, "/media/PrácticasCarrera/Fa.txt" );
  39.             while (<DATOS>) {
  40.             }
  41.         }
  42.         if ( @notas[$i] =~ /sol/ ) {
  43.  
  44.             open( DATOS, "/media/PrácticasCarrera/Sol.txt" );
  45.             while (<DATOS>) {
  46.             }
  47.         }
  48.         if ( @notas[$i] =~ /la/ ) {
  49.  
  50.             open( DATOS, "/media/PrácticasCarrera/La.txt" );
  51.             while (<DATOS>) {
  52.             }
  53.         }
  54.         if ( @notas[$i] =~ /si/ ) {
  55.  
  56.             open( DATOS, "/media/PrácticasCarrera/Si.txt" );
  57.             while (<DATOS>) {
  58.             }
  59.         }
  60.  
  61.     }
  62.  
  63. }
  64.  
  65. print "\n\n\nFin correcto\n\n\n";
  66.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El programa abre un archivo pasado por el parámetro llamada, en el que se encuentran nombres de notas musicales separadas por un espacio, las notas se guardan en un array, el cual se recorre elemento a elemento comprobando el nombre de la nota musical almacenada. Cuando existe coincidencia con el nombre de la nota músical, se procede a la llamada de un archivo de texto alojado en el CD-Rom.

La información del archivo debe ser leída del CD y no de la caché para que los datos se transmitan a través del Bus ATA/IDE, ya que mi interés es medir las emisiones radiadas por el mismo, siendo imposible, sí lo lee directamente de la caché.

Muchas gracias de nuevo.
Última edición por explorer el 2011-06-07 19:16 @844, editado 1 vez en total
Razón: Marcas Perl, formatear código con Perltidy
Hardtechno44
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-06-07 17:00 @750

Re: Limpiar caché en Perl

Notapor explorer » 2011-06-07 19:41 @862

Según lo que he podido leer, el problema está en que, en los procesos de lectura, el sistema operativo realiza la operación de cachear las lecturas desde los dispositivos. Quizás sí funcione la primera vez que sea el fichero Do.txt, pero a la segunda, ya estará cacheado (bueno, salvo que sea un fichero muy grande).

El consejo, entonces, es hacer una lectura sin caché del sistema. Y eso se consigue con las opciones O_DIRECT y O_ASYNC para la función sysopen() (programación a un nivel más bajo. Olvídate de open() y read(). Lee en perlfunc por sysopen(), y sysread()).

Tienes un ejemplo de escritura en este hilo de los Perlmonks.

Se supone que, en lectura, con O_DIRECT, no estás haciendo uso de los caché.

Pero... el propio Linus Torvalds no lo recomienda... aunque... creo que tu interés no va por el de gestionar bases de datos gigantescas :)

Cuidado a lo que dice Morton... parece que, tanto las lecturas como las escrituras deben ser múltiplos de 512 (o del tamaño del bloque físico).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Limpiar caché en Perl

Notapor Hardtechno44 » 2011-06-08 09:43 @447

Hola, he probado ha introducir esto y funciona:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. system('sudo echo 3 | sudo tee /proc/sys/vm/drop_caches');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


limpia la caché detrás de cada lectura y aunque se repita el mismo archivo en la siguiente lectura, se ve obligado a leer del CD-Rom como quiero.
El problema de esto es que la limpieza de caché requiere cierto tiempo y añade un retardo entre la lectura de dos archivos consecutivos y si se pudiera evitar esto, sería mucho mejor.

He probado con sysopen y sysread, pero nada, sigue funcionando la primera lectura únicamente y las demás las copia al instante sin pasar por el bus.

Un saludo, gracias.
Hardtechno44
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-06-07 17:00 @750

Re: Limpiar caché en Perl

Notapor explorer » 2011-06-08 12:39 @569

También es posible que el propio dispositivo tenga un poco de memoria caché, aunque no es normal en dispositivos de almacenamiento óptico.

No sé... estas cosas que quieres hacer yo ya las vi cuando existían arquitecturas uniformes, como las de los ordenadores Atari o Amiga, que eran capaces de generar música con la unidad de disquete, moviendo la cabeza de lectura. Se podía porque, además de que se tenía acceso directo al hardware, ese hardware era el mismo en todas las máquinas que se vendían, por lo que el efecto conseguido lo podías replicar en decenas de miles de máquinas a lo largo de todo el mundo.

Hoy en día... un PC puede ser muy distinto de otro. Y el sistema operativo puede impedir un acceso directo al hardware, para evitar que los "manazas" lo estropeen.

Recuerdo que la última vez que conseguí colgar un ordenador con Linux fue hace diez años, cuando intenté enviar comandos a una tarjeta SCSI, escribiendo directamente en el /dev ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Limpiar caché en Perl

Notapor Hardtechno44 » 2011-06-08 14:05 @628

Entiendo, aunque en este caso el hardware es lo de menos, "no importa" el lector de CD, si no más bien el modo de transferencia usado (en mi caso experimento con UDMA2) y de la velocidad de lectura del dispositivo, ya que a mayor velocidad, mayor frecuencia tendrá la señal radiada.

De todas formas con lo que tengo hecho hasta ahora me basta, ya miraré con más tiempo.

Un saludo y muchas gracias de nuevo.
Hardtechno44
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2011-06-07 17:00 @750


Volver a Administración

¿Quién está conectado?

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

cron