Ir al contenido


Foto

Como leer ficheros grandes?


  • Por favor identifícate para responder
3 respuestas en este tema

#1 BDWONG

BDWONG

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 11 abril 2015 - 02:00

Hola chicos vengo con la duda de como seria la mejor forma de leer ficheros binarios mayores a 100 mb

he visto algunos ejemplos utilizando la clase filestream que lo hacen leyendo por bloques de entre 1024 y 2048 bytes

 

pero si hablaramos de archivos de varios Gb seria lo mas optimo seguir utilizando estos bloques o seria mejor aumentar su tamaño eso si, sin saturar nuestra maquina.

 

tambien vi un ejemplo donde se leia un fichero pero en vez de estar leyendolo por bloques "pequeños", reservaban un bloque del tamaño del archivo a leer

 

ejemplo voy a leer un fichero de 700 mb

y lo que hacia era


php
  1. var
  2. buff:array of byte;
  3. in:Tfilestream;
  4.  
  5. begin
  6.  
  7.   in:=Tfilestream.create('data.exe',fmopenread);
  8.   setlength(buff,in.size);
  9.  
  10.   in.read(buff[0],in.size);
  11.  
  12.   in.free;

bueno mi duda es saber si el anterio codigo es valido o mejor leo por bloques mas pequeños

 


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 11 abril 2015 - 02:26

Bienvenido a DelphiAccess BDWONG

 

Puedes utilizar el procedimiento BlockRead aunque para esos "menesteres" aquí en delphiaccess podemos jactarnos de tener a los mejores en el uso del API de windows :cool: , cualquiera de ellos te dará una mejor alternativa, solo espera un poco.

 

Saludos


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 11 abril 2015 - 04:43

Puedes reservar todo el espacio de memoria que desees, basta con usar la función que propuse aquí. El problema que tienes el la limitación de memoria RAM para realmente manejar esa cantidad que reserves. En realidad estarás usando memoria virtual, esta puede alcanzar toda la posible según tu S.O., pero usará disco, de modo que en los archivos gigantes nunca estarán en RAM completos.

 

TFileStream es una buena solución para la mayoría de los casos, si no para todos, pero en su lugar, puedes usar la API ReadFile que te permite leer 4Gb de una atacada, no se hasta que punto es lo que quieres.

 

Saludos.


  • 1

#4 BDWONG

BDWONG

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 11 abril 2015 - 05:13

Puedes reservar todo el espacio de memoria que desees, basta con usar la función que propuse aquí. El problema que tienes el la limitación de memoria RAM para realmente manejar esa cantidad que reserves. En realidad estarás usando memoria virtual, esta puede alcanzar toda la posible según tu S.O., pero usará disco, de modo que en los archivos gigantes nunca estarán en RAM completos.

 

TFileStream es una buena solución para la mayoría de los casos, si no para todos, pero en su lugar, puedes usar la API ReadFile que te permite leer 4Gb de una atacada, no se hasta que punto es lo que quieres.

 

Saludos.

Gracias por la info, la verdad por el momento no necesito manejar ficheros mayores a 4 gb pero tenia esa duda de que si al leer el fichero de golpe no caeria en una falta o problema que pudiese mermar el rendimiento o la integridad del fichero

 

 

Inclusive hice unas pruebas de cuanto tardaria en procesa un fichero de 100mb primero leyendolo de golpe encontra de leerlo por bloques de 2048 bytes, bueno la verdad me sorprendio que generalmente habia una diferiencia de entre 60 y 70 milisegundos

 

saludos...


  • 0




IP.Board spam blocked by CleanTalk.