Jag måste skriva lite data från en beräkning som kommer att läsas senare av Paraview (.vtu- eller vtk-fil).
När det gäller filstorlek, ska jag gå till ASCII-formatet eller binärt format?
Svar
Om din enda oro är filstorlek, vill du ha binära filer. För ett illustrativt exempel kan vi anta att du skriver 1 flytande punktnummer med dubbla precision till en fil. Låt oss anta att filsystemet kan hantera detta perfekt och att hålla kvar filen, rubriker och stoppning är alla 0.
För en binär fil skulle det numret ta den exakta storleken på numret i RAM, eller 8 byte.
I ASCII-format skulle det innehålla:
- 16 siffror i basen
- 1 period för decimaltal
- 1 tecken för att avgränsa exponenten
- 1 tecken för exponentens tecken
- 2-3 tecken för exponenten
Antar den använder bara 1 byte för ett tecken, det vill säga 22 byte för att innehålla samma nummer. Detta räknar inte de tecken som krävs för att göra skillnaden mellan siffrorna (vanligtvis minst 1). Därför blir filstorleken för ASCII-format ungefär tre gånger större.
Du kan byta in filstorlek för precisionen i de lagrade filerna (behåll bara 5-6 siffror i basen), men det beror på vad du använder dem för. Den huvudsakliga fördelen med ASCII är att felsöka eller producera mänskliga läsbara data.
Kommentarer
- Det är också viktigt inom den vetenskapliga arenan att långsiktig arkivering och pålitlig delning, varför, trots att ’ är ineffektivitet, är ASCII CSV så utbredd och rekommenderas (PDF) .
- En annan användbar punkt är att även om ASCII CSV-kodning inte är ’ inte mycket effektivt, använder du ett filkomprimeringsverktyg (som zip, gzip, etc.) på din ASCI filen kommer vanligtvis att minska filstorleken till något som liknar en binär fil.
- Var försiktig eftersom vissa in / ut-bibliotek inte är ’ t noga för att få lite bit reproducerbarhet när du matar ut IEEE Double Precision-nummer i ASCII och sedan läser in dem igen. Enligt min erfarenhet är det ibland nödvändigt att använda 17 eller 18 decimaler för säkerheten.
- När det gäller horchler ’ s kommentar: Jag ’ är säker på att väl använda, standardiserade öppna binära format som HDF5 kommer att vara kvar länge. Att ’ är vad jag ’ rekommenderar personligen.
- + Jag håller mig till binär när det är möjligt, för noggrannhet, kompaktitet, sinnesro och (särskilt) hastighet. Om jag sedan behöver ytterligare kompakthet kan jag blixtlås. Om jag behöver kunna läsa innehållet visuellt kan jag skriva ett litet program för det. Å andra sidan, om det ’ är viktigare att vara visuell och lätt överförs till slumpmässiga program som Excel, R, etc. är CSV vägen att gå.
Svar
I praktiken behöver du sällan data i visualiseringsfiler som är mer exakta än, säg, 3 giltiga I så fall är ASCII – kanske överraskande – ofta mer kompakt än binär form. Om du funderar på att arkivera, kommer sannolikt att bzip -ing av dessa ASCII-filer kommer att ge de minsta filerna du kan få.
Med detta sagt, läser Paraview VTU-format som har en komprimerad binär form (XML-baserad, men data komprimeras först libz och sedan uu-kodas igen för att ge ASCII-text). På typiska filer sparar detta en faktor 4-10. För stora filer är detta definitivt vägen att gå.
Kommentarer
- Jag röstade upp detta för kontrasten till det andra svaret. Jag har inte ’ ingen stark åsikt på något sätt, men det finns ’ en bra punkt att få här.
- Alternativt kan du nollställa de låga bitarna uttryckligen och komprimera den binära.
- Oj, det skulle kräva en hel del fiddling. Eller finns det funktioner som gör det? (Annat än att kasta för att flyta och tillbaka till dubbelt.)
Svar
tl; dr – lagra filer i utf8 . Om det är tabellformat, använd TAB-separerade värden.
Det verkar som om de rätta alternativen är:
- utf8 text ( inte ASCII . Vi är inte alla amerikansktalande)
- binär
ASAICT den enda verkliga fördelen med binära filer är prestanda. Det är mycket snabbare att ladda en minnesdump i minnet än att generera text på väg ut eller analysera den på väg in.
Eller här: https://auth0.com/blog/beating-json-performance-with-protobuf/ (Detta är inte vetenskapligt och diskuterar övergripande prestanda, med de stora skillnaderna är mängden överförd data och analystiden i ett fall partiskt mot textdata. )
Chansen att ett binärt filformat stöder unicode-text korrekt är dålig, så Om du bryr dig om dataintegritet, använd inte binär . Har du också hört talas om endianproblem? Olika binära representationer av signerade heltal och floats?
Textrepresentationer på -100000 och -1e + 6 ändrar inte värde beroende på på din CPU (i alla fall i utf-8 och ASCII).
Chanserna att ett program som förstår en binär fil fortfarande förstår det eller fortfarande kör 50 år framöver är okänt, förmodligen inte bra . Om du bryr dig om livslängd, använd inte binär .
Det är ofta svårt att läsa binär data från ett annat program, så Om du bryr dig om interoperabilitet, använd inte binär .
Bortsett från: CSV är ett fruktansvärt filformat . Det är enkelt, men ändå illa definierat och kräver en statlig analysator. Använd inte CSV. Om du måste, använd TSV. Det är enklare men bättre definierat och trivialt att analysera.
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
Om du är orolig för storleken, komprimera .
(jag kom hit och letade efter studier av den relativa storlekseffektiviteten för komprimerad binär representation jämfört med komprimerad text. Jag har fortfarande inte hittat bra information förutom den här studien på VRML, men jag är inte ens säker på om det är en jämförelse av base64-kodad binär vs. binär. https://www.cs.unc.edu/~isenburg/papers/is-bcraf-03.pdf .)