Wednesday, May 26, 2010

Re: [PHP-ES] rendimiento al editar archivos binarios

Supongo que tendrás que posicionar el puntero del fichero al byte 640 con
http://php.net/manual/es/function.fseek.php
Y luego escribir normalmente con un fwrite.

if ( !file_exists($cache) || @$this->params['named']['cache'] === 0){
  $handle = fopen($filename, "r+b");
  fseek($handle, 640);
  fwrite($handle, $this->params['id'], 16);
  fclose($handle);
  FireCake::fb(" GENERADO (" . @$this->params['named']['cache'] . ") $referer ($cache)");
}

Hace mucho que no hago estas cosas, puede que me equivoque pero tiene buena pinta, no?

Te recomiendo que encapsules esto un poco más en vez que tirar directamente de $this->params (estás dentro de un controlador???) y valides que todo tiene el tamaño y la forma que debe. Si $this->params['id'] (que es un parámetro por GET al fin y al cabo) tiene un valor raro puede corremper el fichero.

Espero haber sido de ayuda.

Saludos.

El 26 de mayo de 2010 17:16, Manolet Gmail <manolet@gmail.com> escribió:
Saludos, actualmente tengo una aplicacion que edita un archivo binario
cambiando 16 bytes que estan en la misma posicion siempre (640 bytes despues
del inicio del archivo), sin embargo lo que estoy haciendo es leer TODO el
archivo para luego escribirlo usando la funcion pack, lo que siento que es
bastante torpe y desconsiderado con la memoria ram (considerando que
necesito hacer esto cientos de veces al instante). Este es el código que
estoy utilizando.

       if ( !file_exists($cache) || @$this->params['named']['cache'] ===
0){
           $handle     = fopen($filename, "r+b");
           $init         = fread($handle, 640);
                     fread($handle, 16); //esto debe ser exactamente igual
a lo que se reemplaza.
           $full        = fread($handle, filesize($filename)); // leemos el
resto para escribirlo despues
           fclose($handle);

           //las concateno para que sea human readable
           $contents = pack('a640'.'A16'.'a*', $init, $this->params['id'],
$full);

           $handle = fopen($cache, "w+b");
           fwrite($handle, $contents);
           fclose($handle);
           FireCake::fb(" GENERADO (".@$this->params['named']['cache'].")
$referer ($cache)");
       }

Alguna idea de como hacerlo "mas eficiente"?

Arnold

Check out the new CakePHP Questions site http://cakeqs.org and help others with their CakePHP related questions.
 
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@googlegroups.com
To unsubscribe from this group, send email to
cake-php+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/cake-php?hl=en

No comments: