2010-08-03 13 views
5

¿Cuál es la mejor manera de analizar un archivo de coma flotante grande almacenado en ASCII?¿La mejor manera de analizar un archivo de coma flotante grande almacenado en ASCII?

¿Cuál sería la forma más rápida de hacerlo? Recuerdo que alguien me dijo que usar ifstream era malo, porque funcionaba en una pequeña cantidad de bytes, y sería mejor leer primero el archivo en la memoria. ¿Es eso cierto?

Editar: Estoy corriendo 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. Intento leerlos en matrices. Además, los archivos son alrededor de 20   MB cada uno, pero tengo alrededor de 10   GB en ellos.

Segunda edición: Voy a tener que cargar los archivos para mostrar cada vez que quiero hacer una visualización, por lo que sería bueno tenerla lo más rápido posible, pero, sinceramente, si el formato ifstream es razonablemente razonable, no lo haría No me importa seguir con el código legible. Se está ejecutando bastante lento en este momento, pero eso podría ser más una limitación de E/S de hardware que cualquier cosa que pueda hacer en el software, solo quería confirmarlo.

+0

¿Te refieres a un archivo grande con muchos números de coma flotante? –

+0

"Mejor" no siempre significa "más rápido". – strager

+1

¿Qué tan grande es un archivo? ¿Ya tiene una rutina en su lugar que no es lo suficientemente rápida? –

Respuesta

4

Creo que su primera preocupación debería ser qué tan grandes son los números de coma flotante. ¿Flotan o puede haber doble información también? La forma tradicional (C) sería usar fscanf con el especificador de formato para un float y afaik, es bastante rápido. Los iostreams agregan una pequeña sobrecarga en términos de analizar los datos, pero eso es bastante insignificante. En aras de la brevedad, le sugiero que use iostreams (sin mencionar las características de transmisión habituales que obtendrá con él).

Además, creo que realmente ayudará a la comunidad si pudiera agregar los números relevantes junto con su pregunta, como por ejemplo, ¿qué tamaño de archivo está tratando de analizar? ¿Es este un pequeño entorno de huella de memoria (como un sistema integrado).

0

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

1

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

Los días de lento ifstream casi han terminado, sin embargo, es probable que exista cierta sobrecarga en el manejo de las interfaces genéricas de C++.

atof/strtod podría ser la manera más rápida de manejarlo si la cadena ya está en la memoria.

Por último, cualquier intento que hagas para que el archivo se lea en la memoria probablemente sea inútil. Los sistemas operativos modernos generalmente se interponen (especialmente si el archivo es más grande que la RAM, terminará intercambiando código ya que el sistema tratará los datos (ya almacenados en el disco) como intercambiables).

Si realmente necesita ser ridículamente rápido (Los únicos lugares en los que creo que será útil son los enfoques basados ​​en HPC y Map/Reduce) - pruebe mmap (Linux/Unix) o MapViewOfFile para obtener el archivo previamente capturado en la memoria virtual en el enfoque más sensato, y luego atof + manejo de cadenas personalizadas.

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

Cuestiones relacionadas