Il modo migliore per analizzare un file di grandi dimensioni in virgola mobile immagazzinato in ASCII?

StackOverflow https://stackoverflow.com/questions/3401101

Domanda

Qual è il modo migliore per analizzare un file di grandi dimensioni in virgola mobile memorizzati in formato ASCII?

Quale sarebbe il modo più veloce per farlo? Mi ricordo che qualcuno mi diceva usando ifstream era male, perché ha funzionato su un piccolo numero di byte, e sarebbe meglio basta leggere il file in memoria prima. È vero?

Edit: Sono in esecuzione su Windows, e il formato di file è per una nuvola di punti che viene memorizzato nel file come x y z r g b. Sto tentando di leggerli in array. Inoltre, i file sono di circa 20 MB ciascuno, ma ho circa 10 GB di loro.

Secondo edit: Ho intenzione di avere per caricare i file per visualizzare ogni volta che voglio fare una visualizzazione, quindi sarebbe bello avere il più velocemente possibile, ma onestamente, se preforme ifstream ragionevolmente, mi wouldn' t mente attaccare con codice leggibile. E 'in esecuzione piuttosto lento in questo momento, ma che potrebbe essere più di un hardware di I / O limitazione di ogni altra cosa che posso fare nel software, volevo solo confermare.

È stato utile?

Soluzione

Credo che la vostra prima preoccupazione dovrebbe essere quanto grandi i numeri in virgola mobile sono. Sono galleggiano o ci può essere dati doppi troppo? (C) modo tradizionale sarebbe usare fscanf con l'identificatore di formato per un galleggiante ed AFAIK è piuttosto veloce. I iostreams fanno aggiungere un piccolo overhead in termini di analisi dei dati, ma che è piuttosto trascurabile. Per brevità vorrei suggerire di usare iostreams (per non parlare del solito flusso di caratteristiche che si otterrebbe con esso).

Inoltre, penso che sarà davvero aiutare la comunità, se è possibile aggiungere i numeri relativi insieme con la tua domanda, come ad esempio, quanto è grande un file stai cercando di analizzare? Si tratta di un piccolo ambiente di occupazione di memoria (come un sistema embedded).

Altri suggerimenti

E 'tutto basato sul sistema operativo, e la scelta di librerie standard C e C ++.

I giorni di lenta ifstream sono praticamente finita, tuttavia, è probabile che un certo overhead nella gestione di interfacce generiche C ++.

atof / strtod potrebbe essere il modo più veloce per affrontare il problema se la stringa è già in memoria.

Infine, ogni tentativo faresti ad ottenere il file letto nella memoria sarà probabilmente inutile. I sistemi operativi moderni di solito ottengono nel senso (soprattutto se il file è più grande di RAM si finirà per scambiare codice in quanto il sistema tratterà i suoi dati (già memorizzati su disco) come swap).

Se si ha realmente bisogno di essere ridicolmente veloce (Gli unici posti che posso pensare che sia utile sono HPC e Map / Reduce approcci basati) - prova mmap (Linux / Unix) o MapViewOfFile per ottenere il file di precaricare in memoria virtuale in l'approccio più ragionevole, e quindi atof + movimentazione stringa personalizzata.

Se il file è davvero ben organizzato per questo tipo di gioco, si può anche essere eccentrico con mmaps e puntatori e hanno la conversione multithread. Suona come un'esercitazione divertente se si hanno a disposizione 10 GB di carri per convertire in maniera regolare.

Il modo più veloce è probabilmente quello di utilizzare un ifstream, ma è anche possibile utilizzare fscanf. Se si dispone di una piattaforma specifica, si potrebbe a mano caricare il file in memoria e analizzare il galleggiante da manualmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top