Pregunta

¿Cuál es la mejor manera de analizar un archivo de punto flotante grande almacenada en ASCII?

¿Cuál sería la forma más rápida de hacerlo? Recuerdo que alguien me diga utilizando ifstream era malo, ya que trabajó en un pequeño número de bytes, y que sería mejor simplemente leer el archivo en la memoria primero. ¿Es eso cierto?

Edit: Estoy funcionando en Windows, y el formato de archivo es para una nube de puntos que se almacena en filas como x y z r g b. Estoy tratando de leerlos en matrices. Además, los archivos son alrededor de 20 MB cada uno, pero tengo alrededor de 10 GB vale de ellos.

Segunda edición: Voy a tener que cargar los archivos para mostrar cada vez que quiera hacer una visualización, por lo que sería bueno tenerlo lo más rápido posible, pero sinceramente, si preformas ifstream razonable, me wouldn' t cuenta la pervivencia de código legible. Está funcionando bastante lento en este momento, pero que podría ser más de un hardware de E / S limitación que cualquier cosa que pueda hacer en el software, sólo quería confirmar.

¿Fue útil?

Solución

Creo que su primera preocupación debe ser el tamaño de los números de punto flotante son. Se flotan o se pueden haber datos de dobles también? La forma tradicional (C) sería utilizar fscanf con el especificador de formato para un flotador y que yo sepa que es bastante rápido. Los iostreams no se añade una pequeña sobrecarga en términos de análisis de los datos, sino que es más bien insignificante. En aras de la brevedad que sugeriría que utilice iostreams (por no hablar de la corriente habitual características que se obtendría con él).

Además, creo que realmente va a ayudar a la comunidad si se podría añadir los números correspondientes junto con su pregunta, como por ejemplo, qué tan grande un archivo está tratando de analizar? Es este un entorno de huella de memoria pequeña (como un sistema embebido).

Otros consejos

Todo está basado en el sistema operativo, y la elección de las bibliotecas estándar de C y C ++.

Los días de ifstream lenta son más o menos terminado, sin embargo, es posible que haya algo de sobrecarga en el manejo de interfaces genéricas de C ++.

atof / strtod podría ser la manera más rápida para tratar con él si la cadena ya está en la memoria.

Por último, cualquier intento que haría en conseguir el archivo lee en la memoria probablemente será inútil. Los sistemas operativos modernos por lo general en el camino (especialmente si el archivo es mayor que la RAM que va a terminar el intercambio de código ya que el sistema tratará sus ya almacenados en el disco de datos () como intercambiables).

Si realmente necesita ser ridículamente rápido (Los únicos lugares que pueden pensar que será útil son HPC y Mapa / Reducir los enfoques basados) - Pruebe con mmap (Linux / Unix) o MapViewOfFile para obtener el archivo prefetched en la memoria virtual en el enfoque más sensato, y luego atof + manejo de cadenas personalizado.

Si el archivo está muy bien organizado para este tipo de juego, que incluso puede ser peculiar con mmaps y punteros y tienen la conversión multiproceso. Suena como un ejercicio divertido si usted tiene más de 10 GB de flotadores para convertir en una base regular.

La forma más rápida es probablemente usar un ifstream, pero también se puede utilizar fscanf. Si usted tiene una plataforma específica, se puede entregar a cargar el archivo en la memoria y analizar el flotador de forma manual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top