Rozmiar pliku binarnego a plik ASCII

Muszę zapisać dane z obliczeń, które zostaną później odczytane przez Paraview (plik .vtu lub vtk).

Jeśli chodzi o rozmiar pliku, czy powinienem wybrać format ASCII czy binarny?

Odpowiedź

Jeśli jedynym zmartwieniem jest rozmiar pliku, potrzebujesz plików binarnych. Dla przykładu załóżmy, że piszesz do pliku 1 liczbę zmiennoprzecinkową podwójnej precyzji. Załóżmy, że system plików doskonale sobie z tym poradzi, a przechowywanie pliku, nagłówków i wypełnienia wynosi 0.

W przypadku pliku binarnego ta liczba byłaby równa liczbie w pamięci RAM, lub 8 bajtów.

W formacie ASCII przechowałoby:

  • 16 cyfr podstawy
  • 1 kropka na dziesiętną
  • 1 znak odgradzający wykładnik
  • 1 znak jako znak wykładnika
  • 2-3 znaki jako wykładnik

Zakładając wykorzystuje tylko 1 bajt na znak, czyli 22 bajty do przechowywania tej samej liczby. Nie liczy to znaków wymaganych do rozdzielenia liczb (zwykle przynajmniej 1). Dlatego rozmiar pliku w formacie ASCII będzie około 3 razy większy.

Możesz zamienić rozmiar pliku na dokładność przechowywanych plików (zachowaj tylko 5-6 cyfr w bazie), ale to zależy od tego, co używasz ich do. Główną zaletą ASCII jest debugowanie lub tworzenie danych czytelnych dla człowieka.

Komentarze

  • Również ważna na arenie naukowej jest długoterminowa archiwizacja i niezawodność udostępnianie, dlatego pomimo ' nieefektywności, ASCII CSV jest tak rozpowszechniony i zalecany (PDF) .
  • Kolejną użyteczną kwestią jest to, że chociaż kodowanie ASCII CSV nie jest ' t bardzo wydajne, użycie narzędzia do kompresji plików (takiego jak zip, gzip itp.) w ascii file zazwyczaj zmniejszy rozmiar pliku do czegoś podobnego do rozmiaru pliku binarnego.
  • Uważaj, ponieważ niektóre biblioteki wejścia / wyjścia nie są ' nie wystarczająco ostrożne aby uzyskać bit dla odtwarzalności bitów podczas wyprowadzania liczb podwójnej precyzji IEEE w ASCII, a następnie odczytywania ich z powrotem. Z mojego doświadczenia wynika, że ze względów bezpieczeństwa czasami konieczne jest użycie 17 lub 18 cyfr dziesiętnych.
  • W przypadku horchlera ' s komentarz: ja ' z pewnością dobrze używane, ustandaryzowane otwarte formaty binarne, takie jak HDF5, będą dostępne przez długi czas. To ' jest tym, co ' d osobiście polecam.
  • + Jeśli to możliwe, trzymam się binarnych, jeśli to możliwe, zwartość, spokój ducha i (szczególnie) szybkość. Jeśli potrzebuję dalszej zwartości, mogę ją zapiąć. Jeśli potrzebuję wizualnie odczytać zawartość, mogę napisać do tego mały program. Z drugiej strony, jeśli ' ważniejsze jest bycie wizualnym i łatwe przekazywanie do losowych programów, takich jak Excel, R itp., Wówczas najlepszym rozwiązaniem jest CSV.

Odpowiedź

W praktyce rzadko potrzebujesz danych w plikach wizualizacji, które są dokładniejsze niż, powiedzmy, 3 prawidłowe cyfry. W takim przypadku ASCII jest – być może zaskakujące – często bardziej zwarte niż forma binarna. Jeśli myślisz o archiwizacji, wtedy bzipowanie tych plików ASCII prawdopodobnie da najmniejsze pliki, jakie możesz uzyskać.

To powiedziawszy, Paraview odczytuje format VTU, który ma skompresowaną formę binarną (opartą na XML, ale dane są najpierw kompresowane przez libz, a następnie ponownie kodowane uuenkodowane, aby uzyskać tekst ASCII). W przypadku typowych plików oszczędza to współczynnik 4–10. W przypadku dużych plików jest to zdecydowanie właściwa droga.

Komentarze

  • Głosowałem za tym kontrastem do innej odpowiedzi. I tak nie ' nie mam silnej opinii, ale ' to dobra uwaga.
  • Alternatywnie, wyraźne wyzeruj niskie bity i skompresuj plik binarny.
  • Wow, to wymagałoby trochę bity. A może są funkcje, które to robią? (Inne niż rzutowanie na zmiennoprzecinkowe iz powrotem na podwójne).

Odpowiedź

tl; dr – przechowuj pliki w utf8 . Jeśli jest tabelaryczny, użyj wartości oddzielonych tabulatorami.

Wydaje mi się, że poprawne opcje to:

  1. utf8 tekst ( nie ASCII . Nie wszyscy mówimy po angielsku w Ameryce)
  2. binarne

ASAICT jedyną prawdziwą zaletą plików binarnych jest wydajność. Wczytanie zrzutu pamięci do pamięci jest znacznie szybsze niż generowanie tekstu przy wyjściu lub analizowanie go w drodze.

np. https://www.cfd-online.com/Forums/openfoam/136983-binary-gives-significant-performance-advantage-mesh-solve.html

Lub tutaj: https://auth0.com/blog/beating-json-performance-with-protobuf/ (To nie jest naukowe podejście i omawiamy ogólną wydajność, przy czym duże różnice to ilość przesłanych danych i czas analizy w przypadku, który jest ukierunkowany na dane tekstowe. )

Szanse, że format pliku binarnego będzie poprawnie obsługiwał tekst Unicode są niewielkie, więc jeśli zależy Ci na integralności danych, nie używaj binarnych . Czy słyszałeś także o problemach z endianami? Różne binarne reprezentacje liczb całkowitych ze znakiem i liczb zmiennoprzecinkowych?

Reprezentacje tekstowe -100000 i -1e + 6 nie zmieniają wartości w zależności od na twoim procesorze (przynajmniej w utf-8 i ASCII).

Szanse, że program, który rozumie plik binarny, nadal go zrozumie lub nadal będzie działał za 50 lat, jest nieznane, prawdopodobnie nie jest dobre . Jeśli zależy Ci na długowieczności, nie używaj binarnych .

Często trudno jest odczytać dane binarne z innego programu, więc jeśli zależy Ci na współdziałaniu, nie używaj binarnych .

Poza tym: CSV to okropny format pliku . Jest to proste, ale źle zdefiniowane i wymaga parsera stanowego. Nie używaj CSV. Jeśli musisz, użyj TSV. Jest prostszy, ale lepiej zdefiniowany i trywialny do przeanalizowania.

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

Jeśli martwisz się rozmiarem, skompresuj .

(Przyszedłem tutaj, szukając badań nad relatywną wydajnością rozmiaru skompresowanej reprezentacji binarnej w porównaniu z kompresją tekst. Nadal nie znalazłem dobrych informacji poza tym badaniem na temat VRML, ale nie jestem nawet pewien, czy jest to porównanie binarnego kodowania base64 z binarnym. https://www.cs.unc.edu/~isenburg/papers/is-bcraf-03.pdf .)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *