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?
Respuesta
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.
Si se implementa correctamente, esto no debería ser un problema. Supongo que, de forma secuencial, quiere decir que está mirando el archivo en fragmentos discretos y avanzando con su puntero de archivo.
Salida http://www.computing.net/answers/programming/using-fread-with-a-large-file-/10254.html
Suena como que estaba haciendo casi lo mismo que usted.
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.
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
@caf: Gracias. Mi respuesta ha sido cambiada como sugirió. –
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
.
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.
- 1. do fread y fwrite tienen una falla? cómo manejar esto?
- 2. AVAssetExport falla para algunos archivos
- 3. JAVA - Mejor enfoque para analizar archivos JSON grandes (extra grandes)
- 4. Resharper con archivos grandes o * muy * grandes
- 5. Rechazar archivos grandes en git
- 6. Eliminar atómico para grandes cantidades de archivos
- 7. Extensión de archivos grandes para git
- 8. Validación para archivos grandes al Cargar
- 9. Programa para trabajar con archivos CSV grandes
- 10. Mejores prácticas para importar archivos CSV grandes
- 11. Subidas de archivos grandes
- 12. CodeIgniter Cargando archivos grandes
- 13. Oscilación Archivos grandes Rendimiento
- 14. Procesando archivos xml grandes
- 15. java: ¿escribir archivos grandes?
- 16. .Net FileWatcher falla para ~ 80 + archivos
- 17. ¿Cómo configuro IIS para manejar cargas de archivos realmente grandes?
- 18. Buscando en archivos grandes con ifstream
- 19. Lectura de archivos muy grandes en PHP
- 20. Dividir archivos grandes usando PHP
- 21. Muy lento para generar MD5 para archivos grandes usando Java
- 22. Request.BinaryRead (Request.TotalBytes) arroja el error para archivos grandes
- 23. Android: descarga de archivos grandes
- 24. ¿Cómo puedo dividir archivos grandes?
- 25. Configuración de Apache para cargas grandes
- 26. Uso de Emacs para grandes proyectos grandes
- 27. ¿Cómo usar las funciones fread y fwrite para leer y escribir archivos binarios?
- 28. El servicio web WCF falla al recibir datos grandes
- 29. Obtener suma de comprobación MD5 para archivos muy grandes
- 30. ¿Cómo uso Nokogiri :: XML :: Reader para analizar grandes archivos XML?
¿Puedes aclarar el idioma utilizado? –
Voy a seguir adelante y supongo que C – wallacer
do fread y fseek incluso existen como estándares en otro idioma? – wallacer