[eside-ghost] Lectura/escritura eficiente de ficheros en C

KODEMONK en telefonica.net KODEMONK en telefonica.net
Jue Ene 26 23:13:18 CET 2006


La solución fácil es muy fácil, no son más de 10-20 lineas. Usar fscanf 
y freadf no es nada óptimo, sobre todo si el fichero es binario. Si el 
fichero es binario (como puede ser el caso en un cp o un cat) quiere 
decir que no puedes hacer un fscanf(%s) para leer varios caracteres a 
la vez, ya que no tiene por que haber \0's, de manera que para estar 
completamente seguro tendrías que hacer un fscanf  de %u, es decir leer 
un unsigned int, con lo que tendrías un buffer de 4 bytes. Funcionaría 
pero sería poco eficiente, eso sí sería una solución mejor que putc y 
getc (en donde el buffer sría 1)

A mi la solución más eficiente que se 
me ocurre, es hacer un mmap al fichero, reservar un buffer con malloc
(tam fichero), si falla de tam medios, si falla de tam/4 etc.. y con el 
malloc más grande que podamos ir leyendo porciones de fichero en 
formato void* e i escribiendolas en la salida con un fwrite.

Eso sí, 
que en ninguna de las soluciones ni en la más sencilla ni en la más 
facil,  hay que olvidar de bloquear el fichero con fcntl, mmpar creo 
que no te asegura una lectura por encima del tamaño que has reservado 
(si el fichero crece) ni por debajo si decrece.

Espero que te sirva de 
algo ;D

Un abrazo Alex 

----Mensaje original----
De: borja en borjanet.
com
Recibido: 26/01/2006 22:03
Para: "Lista de eside-ghost"<eside-
ghost en deusto.es>
Asunto: [eside-ghost] Lectura/escritura eficiente de 
ficheros en C

Hola a todos,

Bueno, esta es una pregunta de C, pero a 
demasiado bajo nivel para 
enviarla a las listas de C de ESIDE (aparte 
de que me interesa saber la 
opinión de los low-level jeinkers ;-)

En 
la asignatura de programación que imparto aquí en Chicago vamos a 
pedirles a los alumnos que reimplementen algún comando estandar de 
UNIX 
que manipule ficheros (cat o cp, por ejemplo). Como "solución 
base", 
vamos a aceptar que hagan la lectura/escritura de ficheros con 
funciones 
como fprintf/fscanf, pero daremos puntos extra a quien 
encuentre una 
solución más eficiente.

Lo que pasa es que tampoco 
tenemos muy claro cómo sería esa solución 
"más eficiente" ;-) Por lo 
que tengo entendido (y corregidme si me 
equivoco), utilizar 
fprintf/fscanf para manipular ficheros muy grandes 
puede ser poco 
eficiente, y hay llamadas a más bajo nivel para mapear 
los ficheros 
directamente a memoria y luego transferir datos entre 
ficheros 
utilizando memcpy, no? A bote pronto, diria que hay que hacerlo 
con 
mmap y munmap, pero igual esa no es la mejor manera de hacerlo. Me 
imagino que otra alternativa sería utilizando read()/write() a pelo 
con 
un tamaño de buffer óptimo.

En fin, si alguien puede 
proporcionarme alguna pista (o enlaces a 
documentos que traten sobre 
este tema), pues lo agradecería :-)

Un saludo,
-- 
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Borja 
Sotomayor, University of Chicago
  Ph.D. Student, Department of 
Computer Science
  Hinds 016, 5734 South Ellis Avenue, 60637 Chicago, 
IL
GT4 Tutorial: http://gdp.globus.org/gt4-tutorial/
BorjaNet:  http:
//www.borjanet.com/   borja en borjanet.com
·····························································
          
"Dis maschine vill run und run!"
                -- Kurt Gödel (on the 
Turing Machine)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

_______________________________________________
eside-ghost mailing 
list
eside-ghost en deusto.es
https://listas.deusto.
es/mailman/listinfo/eside-ghost





Más información sobre la lista de distribución eside-ghost