Ho bisogno di scrivere alcuni dati da un calcolo, che verrà letto in seguito da Paraview (file .vtu o vtk).
Quando si tratta della dimensione del file, dovrei scegliere il formato ASCII o il formato binario?
Risposta
Se la tua unica preoccupazione è la dimensione del file, allora vuoi i file binari. Per un esempio illustrativo, supponiamo che tu stia scrivendo 1 numero in virgola mobile a doppia precisione in un file. Supponiamo che il file system possa gestirlo perfettamente e che il file, le intestazioni e il riempimento siano tutti 0.
Per un file binario, quel numero prenderebbe la dimensione esatta del numero nella RAM, o 8 byte.
In formato ASCII, conterrebbe:
- 16 cifre della base
- 1 punto per il decimale
- 1 carattere per delimitare lesponente
- 1 carattere per il segno dellesponente
- 2-3 caratteri per lesponente
Supponendo usa solo 1 byte per un carattere, cioè 22 byte per contenere lo stesso numero. Questo non conta i caratteri richiesti per dilimitare i numeri (di solito almeno 1). Pertanto la dimensione del file per il formato ASCII sarà circa 3 volte maggiore.
Puoi scambiare la dimensione del file con la precisione dei file memorizzati (mantieni solo 5-6 cifre nella base), ma dipende da cosa li stai usando per. Il vantaggio principale di ASCII è per il debug o la produzione di dati leggibili dalluomo.
Commenti
- Importante anche nellarena scientifica è larchiviazione a lungo termine e affidabile condivisione, motivo per cui, nonostante le ‘ inefficienze, ASCII CSV è così diffuso e consigliato (PDF) .
- Un altro punto utile è che sebbene la codifica CSV ASCII non sia ‘ molto efficiente, utilizzando unutilità di compressione file (come zip, gzip, ecc.) sul tuo ascii file in genere ridurrà la dimensione del file a qualcosa di simile alla dimensione di un file binario.
- Fai attenzione perché alcune librerie di input / output non sono ‘ abbastanza attente per ottenere la riproducibilità bit per bit quando si emettono numeri IEEE Double Precision in ASCII e poi li si legge di nuovo. Nella mia esperienza, luso di 17 o 18 cifre decimali a volte è necessario per sicurezza.
- Riguardo a horchler ‘ s comment: Sono ‘ sicuro che i formati binari aperti standardizzati e ben utilizzati come HDF5 saranno disponibili per molto tempo. Questo ‘ è ciò che ‘ consiglio personalmente.
- + Mi attengo al binario quando possibile, per la precisione, compattezza, tranquillità e (soprattutto) velocità. Quindi se ho bisogno di ulteriore compattezza, posso comprimerlo. Se ho bisogno di essere in grado di leggere visivamente il contenuto, posso scrivere un programmino per quello. Daltra parte, se ‘ è più importante essere visivi e passare facilmente a programmi casuali come Excel, R, ecc., CSV è la strada da percorrere.
Risposta
In pratica, raramente hai bisogno di dati nei file di visualizzazione più precisi di, diciamo, 3 validi cifre. In tal caso, ASCII è, forse sorprendentemente, spesso più compatto della forma binaria. Se stai pensando di archiviare, è probabile che il bzip di questi file ASCII produca i file più piccoli che puoi ottenere.
Detto questo, Paraview legge il formato VTU che ha un formato binario compresso (basato su XML, ma i dati vengono prima compressi con libz e poi nuovamente codificati con uu per produrre testo ASCII). Su file tipici, questo consente di risparmiare un fattore di 4-10. Per file di grandi dimensioni, questa è sicuramente la strada da percorrere.
Commenti
- Ho votato per il contrasto con laltra risposta. In ogni caso, ‘ non ho una forte opinione, ma ‘ un buon punto da cogliere qui.
- In alternativa, azzera esplicitamente i bit bassi e comprimi il binario.
- Wow, ciò richiederebbe un po di manipolazione. O ci sono funzioni che lo fanno? (A parte il casting per float e di nuovo per raddoppiare.)
Answer
tl; dr – archivia i file in utf8 . Se è tabulare, utilizza valori separati da TAB.
Mi sembra che le opzioni corrette siano:
- utf8 testo ( non ASCII . Non siamo tutti di lingua inglese americana)
- binario
ASAICT lunico vero vantaggio dei file binari sono le prestazioni. È molto più veloce caricare un dump della memoria in memoria che generare testo alluscita o analizzarlo allingresso.
Oppure qui: https://auth0.com/blog/beating-json-performance-with-protobuf/ (Questo non è scientifico e sta discutendo le prestazioni generali, con le grandi differenze che sono la quantità di dati trasmessi e il tempo di analisi in un caso sbilanciato verso i dati testuali. )
Le possibilità che un formato di file binario supporti correttamente il testo Unicode sono scarse, quindi se ti interessa lintegrità dei dati, non utilizzare binario . Hai anche sentito parlare di problemi endian? Diverse rappresentazioni binarie di interi e float con segno?
Le rappresentazioni di testo di -100000 e -1e + 6 non cambiano a seconda del valore sulla tua CPU (in utf-8 e ASCII, in ogni caso).
Le possibilità che un programma che comprende un file binario lo capisca ancora o lo esegua ancora tra 50 anni sono sconosciute, probabilmente non buone . Se ti interessa la longevità, non utilizzare il file binario .
Spesso è difficile leggere i dati binari da un altro programma, quindi se ti interessa linteroperabilità, non utilizzare .
A parte: CSV è un formato di file terribile . È semplice, ma mal definito e richiede un parser stateful. Non utilizzare CSV. Se devi, usa TSV. È più semplice ma meglio definito e banale da analizzare.
https://chriswarrick.com/blog/2017/04/07/csv-is-not-a-standard/
https://www.cloudbakers.com/blog/everything-you-didnt-want-to-have-to-know-about-csv
Se “sei preoccupato per le dimensioni, comprimi .
(Sono venuto qui alla ricerca di studi sullefficienza relativa alle dimensioni della rappresentazione binaria compressa rispetto a quella compressa testo. Non ho ancora trovato buone informazioni a parte questo studio su VRML, ma non sono nemmeno sicuro che si tratti di un confronto tra binario con codifica base64 e binario. https://www.cs.unc.edu/~isenburg/papers/is-bcraf-03.pdf .)