c tamaño máximo para que el archivo se lea en ubuntu

Me preguntaba en qué establecer el tamaño de mi búfer [] para leer archivos en ubuntu.

¿Alguien sabe el tamaño máximo que se puede leer usando los descriptores de archivo read () de un archivo?

Probé 1GB y obtuve un error de segmentación, probé 4MB, está bien.

¿No está seguro de qué búfer de caracteres [BUFSIZ] tiene un tamaño diferente en diferentes plataformas?

¿Alguna sugerencia sobre cuál sería el mejor tamaño para configurar el búfer?

Muchas Gracias

preguntado el 08 de enero de 11 a las 21:01

No hay razón para leer grandes porciones a la vez. Si está realizando un procesamiento no trivial de los datos, 4-64k es suficiente para que no mejore el rendimiento para leer más. Si se trata de una copia pura sin procesamiento, podría beneficiarse de aumentar eso ligeramente, pero en cualquier caso, debe medir y nunca usar un búfer más grande del que obtiene un beneficio medible. -

5 Respuestas

Usar un tamaño fijo para su búfer probablemente no sea una buena idea. Nunca se sabe qué tan grande puede ser un archivo, realmente ...

Es posible que leer archivos grandes en la memoria tampoco sea deseable, pero si debe hacerlo, quizás debería considerar primero el uso de la stat() y fstat() funciones para averiguar qué tan grande es realmente el archivo, luego asigne el búfer dinámicamente usando malloc()/calloc() o usar mmap().

Probablemente también pueda buscar en Google información sobre cómo utilizar estas funciones. También debería haber información sobre otras formas de obtener el tamaño de archivo de un archivo.

Pero si puede evitarlo, no lea archivos grandes en la memoria. Más bien, lea fragmentos a la vez y procese esos bits como lo haría.

Respondido el 09 de enero de 11 a las 00:01

(+1) para el consejo de mmap () (linux.die.net/man/2/mmap). La limitación del archivo sería la restricción del espacio de direcciones de memoria. - Raphael Bossek

El error de segmentación que recibió no tiene nada que ver con los tamaños máximos de archivo. Más bien, está asignando un búfer en la pila que excede el espacio de pila de su programa.

Cuando declaras una matriz como:

char buffer[BUFSIZ];

... asigna BUFSIZ bytes en el montón. La cantidad de espacio de pila que tiene varía según su plataforma y compilador, pero generalmente no tiene un tamaño de 1 GB. En algunas distribuciones de Linux con gcc, el tamaño de pila predeterminado es de 8 MB.

Si necesita asignar un búfer grande para leer el archivo, deberá asignarlo en el montón utilizando uno de los malloc familia de funciones.

char* buffer = malloc(BUFSIZ);

Recuerde, también deberá liberar el búfer cuando haya terminado de usarlo.

free(buffer);

Respondido el 09 de enero de 11 a las 01:01

No lo lea de una vez. El tamaño del búfer en realidad depende de cuánto pueda asignar. es decir, unos pocos MB usando la pila y virtualmente ilimitados usando malloc (gracias a la memoria virtual): en este último caso, si su archivo es de varios GB, entonces necesitará esa cantidad de memoria.

Simplemente léalo bloque a bloque usando read / fread y estará seguro. Nadie quiere llenar su memoria solo para leer un archivo. 4kB es un tamaño de búfer fino, porque generalmente es del tamaño de una página de memoria. Y puede ubicarlo fácilmente en la pila sin errores de segmentación.

Respondido el 09 de enero de 11 a las 00:01

usando malloc () si configuro el búfer en cualquier tamaño de archivo usando fstat, ¿cuál es el tamaño máximo que mantendrá? ¿La memoria es ilimitada, es decir, sin límites? ¿O hay un límite en la cantidad de memoria que asigna usando malloc ()? - daza166

Leer el tamaño máximo no es necesariamente lo más eficiente. Por lo general, el sistema operativo realiza el almacenamiento en búfer debajo, por lo que el tamaño solicitado no siempre es muy importante. Sin embargo, leer el tamaño del sector (a menudo 4K) es un buen tamaño para lecturas secuenciales.

Respondido el 09 de enero de 11 a las 00:01

No olvide que cada tipo de sistema de archivos tiene sus propias limitaciones de tamaño de archivo:

  • Sistema de archivos paralelo general de IBM = 2 ^ 99
  • XFS = 8 EiB = 8 * 2 ^ 60
  • OCFS = 4 PiB = 4 * 2 ^ 50
  • ext4 = 16 TiB = 16 * 2 ^ 40
  • ext2 / ext3 = 2 TiB = 2 * 2 ^ 40

Respondido el 09 de enero de 11 a las 01:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.