[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