LEER DE UN FICHERO BYTE A BYTE SIMULANDO UN READ, PERO MUCHISIMO MAS RAPIDO - .: .: Saiyine :. :.

Leer de un fichero byte a byte simulando un read, pero muchisimo mas rapido

Por Saiyine Enviar correo el 0000-00-00 00:00:00 - Secciones:  DELPHI  - Enlace permanente: 483

A peticion de Manulon, ahi va una unidad para lectura rapida de ficheros... forma parte de un viejo proyecto, de cuando salieron los mp3, tenia curiosidad por ver cual era el mejor compresor e hice un comparador de wavs, quizas algun dia haga una version 'para todos los publicos' para que saqueis vuestras propias conclusiones...

La unidad debe llamarse UCacheLecturaSecuencial.pas para evitar problemas (los nombres largos del windows hay que aprovecharlos ).

unit UCacheLecturaSecuencial;

interface

type
        Fichero_CLS = class
        private
        f : file;
        buf : array[0..1999] of byte;
        status,puntero,punterototal,maximo : integer;
        procedure Actualizar;
        public
        constructor Crear(fichero : string);
        destructor Cerrar;
        function LeerByte : byte;
        function LeerInteger : Integer;
        function LeerLongint : Longint;
        function ComprobarEstado : Integer;
end;

implementation

procedure Fichero_CLS.Actualizar;
begin
        blockread(f,buf,sizeof(buf),maximo);
        puntero:=0;
        if maximo>0
        then status:=0
        else status:=1;
end;

constructor Fichero_CLS.Crear(fichero : string);
begin
        assignfile(f,fichero);
        reset(f,1);
        Actualizar;
        punterototal:=0;
end;

destructor Fichero_CLS.Cerrar;
begin
        closefile(f);
end;

function Fichero_CLS.LeerByte : byte;
begin
        result:=buf[puntero];
        inc(puntero);
        inc(punterototal);
        if puntero>=maximo then Actualizar;
end;

function Fichero_CLS.LeerInteger : Integer;
var
aux : integer;
begin
        aux:=LeerByte;
        aux:=aux*$FF+LeerByte;
        result:=aux;
end;

function Fichero_CLS.LeerLongint : Longint;
var
aux : Longint;
begin
        aux:=LeerByte;
        aux:=aux*\$FF+LeerByte;
        aux:=aux*\$FF+LeerByte;
        aux:=aux*\$FF+LeerByte;
        result:=aux;
end;

function Fichero_CLS.ComprobarEstado : Integer;
begin
        result:=status;
end;

end.

Para usarla basta añadir UCacheLecturaSecuencial.pas al directorio del programa o a un directorio especifico para librerias y meter UCacheLecturaSecuencial en el uses de la unidad que lo use. Un ejemplo de uso seria este:

procedure TForm1.Button1Click(Sender: TObject);
var
fich : Fichero_CLS;
begin
        fich:=Fichero_CLS.Crear('y:\gadda_CD.wav');
        while fich.ComprobarEstado=0 do
        Caption:='Primer entero: '+ inttostr(fich.LeerByte);
        fich.Cerrar;
end;
Jose Luis (27/01/2005, 19:22)

Hola Saiyine.

Te escribo interesado en la informacion que tienes sobre la lectura rapida de un fichero (byte a byte). Yo tengo que hacerlo pero en C++ y escribia a ver si me puedes echar una mano. La verdad es que no entiendo muy bien lo que haces con ese codigo (supongo que tendra que ver que yo no tengo ni idea de delphi) y me preguntaba si me podrías explicar que es lo que haces exactamente.

Mi problema es que tengo que leer (solo leer) datos de tamaño fijo desde un archivo binario que ya esta creado. Se que utilizando la API de Windows hay una manera de hacerlo de forma rapida (utilizando las funciones createfile, creo que virtualalloc...) siempre que antes prepares el sistema adecuadamente, si no el programa es igual de lento que haciendo un read. Si puedes explicarme como va tu codigo tal vez me ayude en mi proyecto.

Gracias de antemano y un saludo
Joste

Saiyine (28/01/2005,01:19)

Hola, Joste.

Procuro no acercarme a nada que huela a C, salvo cuando no hay más remedio, y cuando no lo hay procuro limpiar mi mente enseguida, así que no te sabria decir lineas de código de lo que tienes que hacer.

Lo que si puedo decirte que con createfile, por el nombre de la función, no vas bien para leer de un fichero. La función read que mencionas imagino que será la misma que poseen todos los lenguajes para leer de un fichero, salvo que me esté confundiendo, con que le subas el tamaño del buffer de lectura bastará para que obtengas un gran aumento de velocidad de lectura.

Mi código, que por cierto lleva ya casi cuatro escrito así que lo tengo algo olvidado, simula un "read" de byte en byte, que normalmente seria lentisimo, pero usando internamente lectura en bloques mucho más grandes, que forman una cache que acelera mucho el proceso. Es decir, el usuario lee el fichero byte a byte, mientras que el programa lee bloques según sea necesario. Vaya, una caché de lectura de toda la vida.

En esta página parece que hacen algo similar en C++.


Jose Luis (31/01/2005, 18:50)

Hola otra vez!!

Asi que c++ te da urticaria, jeje. Yo ahora me estoy iniciando en java, pero hasta que lo domine mejor sigo con c++

Bueno, para empezar gracias por la ayuda, aunque me temo que mis investigaciones no van por ese camino aunque voy a mirar un poco sobre la cache de lectura... me ha gustado. El link que me has puesto trata sobre escritura y lectura estandar de archivos. No es lo que busco.

Por otro lado, la funcion CreateFile de la API de windows si que sirve para abrir archivos, aunque si no existe el mismo lo crea. La idea que tengo en mente es reservar un espacio de memoria virtual (creo que con virtualalloc de la api tambien), abrir un archivo y luego copiar todo lo necesario a toda pastilla. A ver si lo consigo. Lo que pensaba era hacerlo con un puntero, despues de haber reservado la zona de memoria virtual y teniendo la posición de memoria de los datos, recorrer con un puntero los datos y copiarlo, pero estoy seguro de que hay una forma mas rapida de conseguirlo mediante bloques de memoria. Lo que no se es que funcion utilizar y como utilizarla.
Bueno sigo investigando, y gracias otra vez.

Por cierto, me ha entrado curiosidad con esto de delphi, igual me miro algo...

Un saludo

Otras entradas de la web que podrian interesarte:

Gravatar 2035
Banderita castor2k (2008-03-29 01:14:15)

Hola muchachos:

Recurro a ustedes porque es el foro mas adecuado a lo que estoy investigando.

Necesito realizar un programa (En delphi o lo que me sugieran) que realice la copia de la lectura de un fichero binario, de una maquina a otra, cada vez que el fichero, en la maquina fuente, se actualice o le llegue un nuevo registro. NEcesito hacer esto puesto que no puedo esperar a que el archivo en la maquina fuente se llene y despues transferirlo por ftp.

Espero me puedan colaborar

gracias...

Sin gravatar 3652
Banderita Anonimo (2009-08-19 08:51:38)

6 :x

Sin gravatar 3785
Banderita Mr.PAC (2009-09-30 01:40:12)

Saiyine, muy buena tu clase con metodos para acceder a un archivo y leerlo byte a byte.
Gracias por el aporte.
Mr.PAC

Gravatar 5475
Banderita Anonimo (2011-09-13 02:50:09)

x la vida de la gran [Piiii]! estoy desesperado amigos! necesito ayuda! miren estoy haciendo un proyecto de progra y quiero saber como [Piiii] leer bytes de una imagen bmp manualmente, sin usar las librerias y metodos de java que ya hacen eso, sino que sea manualmente, es un ImageHandler (asi se llama mi proyecto) y tengo que leer los bytes de una imagen bmp de 24 bits, amigos porfavor como puedo hacer esto???

o o o o 


Tu nombre (Nick):

Tu correo (Email):
  Necesario para tu gravatar!

Tu página (URL):

Escribe aqui tu comentario:

       :noworry: :roll: :huh: :push: :OO 8) 8O :( :) :? :D :P :o :x :| ;) ^^ xD



Vista previa activada.

Vista previa (6/6/6, 6:66)


Fondos de pantalla

. . .

dreamhost

Descargas

  • ApagaPC
    apagapc241.exe  (4488)
  • LimpiaDocus
    LimpiaDocus001.exe  (3792)
  • RCM
    rcm001.zip  (3200)
  • Popmail
    popmail-0.4-psmn.tar.gz  (3272)
  • Manual de Delphi en PDF
    delphi_pdf.zip  (3904)
  • Evangelio del Perl
    Evangelio_del_perl.pdf  (3983)
  • Excel Simpsons
    Excel Simpsons  (3914)
  • . . .

    Proyectos Online

  • Saiyine Store
  • Kunowalls!!!
  • Fondos de pantalla
  • Picaday: imagenes sexys o chocantes.
  • Scarlett: fotos de Scarlett Johansson
  • WhatsmyIP: obtener tu IP pública
  • Uma Thurman: galeria de Uma Thurman
  • FunPics: imagenes graciosas
  • . . .

    Blogs

  • Por lo que más querais, no entreis a estos: Tapanez, Yhandros, Onez.

  • Otros en español: El Mundo Today, La libreta de Van Gaal, Chavalina, Kirai, Mundo Geek, Microsiervos.

  • Mis lecturas en guiri: Michael Yon, Coding Horror, YCombinator news, MySQL Performance, Slashdot.

    . . .
  • Utilidades

  •  Coral  (1645), cacheando webs
  •  Spam.la  (1983), correo de usar y tirar
  •  Mailinator  (1887), correo de usar y tirar
  •  Bug me not  (1635), absurdos registros di NO
  •  Trashmail  (1692), correo de usar y tirar

    . . .

  • Página web ©2001-2011 Saiyine descargada en s, con 6094868 visitas en total, hoy (de un total de 0 previstas).

    . . .