2010-09-29 17 views
5

Tengo que analizar un archivo de 16 GB. Estoy leyendo el archivo secuencialmente usando fread() y fseek(). ¿Es factible? ¿Funcionará fread() para un archivo tan grande?¿Fread falla para archivos grandes?

+0

¿Puedes aclarar el idioma utilizado? –

+0

Voy a seguir adelante y supongo que C – wallacer

+0

do fread y fseek incluso existen como estándares en otro idioma? – wallacer

Respuesta

2

Depende de lo que quieras hacer. Si desea leer los 16 GB completos de datos en la memoria, es probable que se quede sin memoria o espacio de pila de aplicaciones.

En lugar de leer el fragmento de datos por fragmento y procesar en esos trozos (y recursos gratuitos cuando haya terminado).

Pero, además de todo esto, decida qué enfoque desea hacer (usando fread() o istream, etc.) y haga algunos casos de prueba para ver cuál funciona mejor para usted.

5

Usted no menciona un idioma, así que voy a asumir C.

no veo ningún problema con fread, pero fseek y ftell pueden tener problemas.

Estas funciones usan long int como el tipo de datos para mantener la posición del archivo, en lugar de algo inteligente como fpos_t o incluso size_t. Esto significa que pueden fallar al trabajar en un archivo de más de 2 GB, y ciertamente puede fallar en un archivo de 16 GB.

Necesitas ver qué tan grande es long int en tu plataforma. Si son 64 bits, estás bien. Si es 32, es probable que tenga problemas al usar ftell para medir la distancia desde el inicio del archivo.

Considere utilizar fgetpos y fsetpos en su lugar.

+0

El comentario * "... legalmente no se pueden usar compensaciones' fseek' que no sean cero sin una llamada a 'ftell'" * solo se aplica a los archivos abiertos en modo texto. Los archivos abiertos en modo binario pueden usar 'SEEK_SET' y' SEEK_CUR' con desplazamientos arbitrarios. – caf

+0

@caf: Gracias. Mi respuesta ha sido cambiada como sugirió. –

2

Si está en un sistema POSIX-ish, deberá asegurarse de haber creado su programa con soporte de desplazamiento de archivos de 64 bits. Los mandatos POSIX (o al menos permiten, y la mayoría de los sistemas lo hacen) la implementación para denegar operaciones IO en archivos cuyo tamaño no se ajusta al off_t, incluso si el único IO que se está ejecutando es secuencial sin búsqueda.

En Linux, esto significa que necesita usar -D_FILE_OFFSET_BITS=64 en la línea de comando gcc.

3

Gracias por la respuesta. Descubrí dónde me estaba yendo mal. fseek() y ftell() no funcionan para archivos de más de 4 GB. Usé _fseeki64() y _ftelli64() y está funcionando bien ahora.

Cuestiones relacionadas