[eside-ghost] Lectura/escritura eficiente de ficheros en C
Alejandro López Monge
kodemonk en telefonica.net
Jue Ene 26 23:25:25 CET 2006
Vaya hombre ahora que lo leo con las prisas he juntado dos soluciones, la primera,
la sencilla está bien, pero la de mmap está mal mmap mapea el fichero en memoria,
de manera que no tienes por que reservar un buffer de memoria, simplemente definir
un tamaño e ir indexando a través del fichero cargado en memoria y haciendo
fwrites. Lo de fcntl para comprobar el fichero sigue haciendo falta.
La otra soluión con la que he hecho un merge, sería crear tú en memoria un buffer
lo más grande posible en memoria, con malloc (en el anterior explicaba una
solución rápida de aproximar el mayor tamaño contiguo que puedes conseguir) y
hacer fread(fichero, tambuffer), fwrite(buffer, tam, indexación)
Ahora tiene mejor pinta ;D
On Thu, 26 Jan 2006 23:13:18 +0100
(MET)"KODEMONK en telefonica.net" <KODEMONK en telefonica.net> wrote:
> 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
>
>
>
>
--
Alejandro López Monge
Universidad de Deusto
Aptdo. 1
48080 - Bilbao (SPAIN)
Ext: 2933
e-mail: kodemonk en emasterminds.net
Más información sobre la lista de distribución eside-ghost