2010-08-02 14 views
11

Mam trudny czas, aby wybrać format, z którym mój serwer i moje punkty końcowe będą się komunikować.
Zastanawiam:Najbardziej wydajny format przesyłania danych do iz urządzeń wbudowanych

  • JSON
  • YAML zbyt trudne do analizowania
  • CSV
  • Google Protobufs
  • Binary pakowania/rozpakowywania (bez użycia odlewniczej/memset/memcpy, aby umożliwić przenoszenie)
  • Niektóre formy DSL
  • Każda inna propozycja może mieć

moich criterias są uporządkowane od najbardziej do najmniej ważne:

  1. Jaki jest najłatwiejszy do analizowania?
  2. Który procesor jest najszybszy?
  3. Który ma najmniejszy bajt?
  4. Który z nich może mieć najbardziej czytelne wiadomości?
  5. Które z nich można łatwiej szyfrować?
  6. Które z nich można łatwiej skompresować?

EDIT wyjaśnienie:

  • Czy transfery danych dwukierunkowy? Tak.
  • Czym jest transport fizyczny? Ethernet.
  • Czy dane są sformatowane jako pakiety lub strumienie? Oba, ale zazwyczaj pakiety.
  • Ile RAM ma punktów końcowych? Najmniejsza możliwa ilość zależy od formatu, który wybiorę.
  • Jak duże są twoje dane? Tak duża, jak być musi. Nie otrzymam jednak ogromnych zbiorów danych.
  • Czy punkt końcowy ma RTOS? Numer
+0

"najmniejsza ładowność" ma oznaczać "najmniejszy narzut"? Odpowiedź zależy od danych i nieco od częstotliwości aktualizacji. "Tak duże, jak powinno być", przenosi zerową informację. – peterchen

+0

@peterchen: To dlatego, że nadal nie mam. Wiem tylko, że nie otrzymam zbiorów danych powyżej 1 MB. Najmniejszy ładunek oznacza format, który będzie miał mniej bajtów do przeniesienia, a następnie do innych. –

+0

Byłoby dobrze, gdybyś rzucił okiem na dane - lub przynajmniej dokonał jakichś wykształconych przypuszczeń. ---- btw.W moim rozumieniu, ładunek jest ilością netto rzeczywistych informacji, przez które przechodzisz (zakładam, że chcesz najwięcej ładunku w najmniejszej łącznej kwocie). – peterchen

Odpowiedz

4

Kluczowymi czynnikami są:

  • jakie możliwości mają swoich klientów? (np. Czy potrafisz wybrać parser XML z półki - bez wykluczania większości z nich ze względu na wydajność? Czy możesz kompresować pakiety w locie?)
  • Jaka jest złożoność twoich danych ("płaska" lub głęboko structured?)
  • Czy potrzebujesz aktualizacji o wysokiej częstotliwości? Częściowe aktualizacje?

Z mojego doświadczenia:

Prosty protokół tekst (które klasyfikują się jako DSL) z interfejsem

string RunCommand(string commandAndParams) 
// e.g. RunCommand("version") returns "1.23" 

sprawia wielu aspektach łatwiejsze: debugowania, rejestrowanie i śledzenie, rozszerzenie protokołu itp. Posiadanie prostego terminalu/konsoli do urządzenia jest nieocenione w wykrywaniu problemów, uruchomianiu testów itp.

Let's d Ogranicza szczegółowo ograniczenia, jako punkt odniesienia dla innych formatów:

  • Klient musi uruchomić mikroprocesor. To nie jest tak skomplikowane, jak mogłoby się wydawać (rdzeniem mojej "biblioteki mikroprocesorów" jest 10 funkcji z około 200 liniami kodu całkowitego), ale podstawowe przetwarzanie ciągów powinno być możliwe
  • Źle napisany parser to duża powierzchnia ataku. Jeśli urządzenia są krytyczne/wrażliwe lub oczekuje się, że będą działać w nieprzyjaznym środowisku, wdrożenie wymaga najwyższej staranności. (Dotyczy to również innych protokołów, ale szybko zhakowany parser tekstowy łatwo się pomylił)
  • Koszty ogólne. Może być ograniczony przez mieszany protokół tekstowy/binarny lub base64 (który ma narzut 37%).
  • Opóźnienie. Przy typowym opóźnieniu sieci, nie będziesz chciał wydać wielu małych komend, sposób żądania grupowania i ich zwroty pomagają.
  • Kodowanie. Jeśli musisz przesłać łańcuchy, które nie są reprezentowalne w ASCII, i nie mogą używać czegoś takiego jak UTF-8 do tego na obu końcach, zaleta protokołu tekstowego szybko spada.

bym użyć binarny protokół tylko jeśli wymagane na urządzeniu, możliwości przetwarzania urządzenia są szalenie niska (powiedzmy, kontrolery USB z 256 bajtów RAM) lub szerokości pasma jest poważnie ograniczona. Większość protokołów, z którymi pracowałem, używa tego, i to jest ból.

Google protBuf to podejście, które ułatwia uczynienie protokołu binarnego. Dobry wybór, jeśli możesz uruchamiać biblioteki po obu stronach i mieć wystarczającą swobodę, aby zdefiniować format.

CSV to sposób na spakowanie dużej ilości danych w łatwo przetwarzanym formacie, co stanowi rozszerzenie formatu tekstowego. Ma jednak bardzo ograniczoną strukturę. Używałbym tego, jeśli wiesz, że twoje dane pasują.

XML/YAML/... będę używać tylko wtedy, gdy moc obliczeniowa nie jest problemem, przepustowość albo nie jest kwestia czy można kompresować w locie, a dane ma bardzo złożoną strukturę . JSON wydaje się być nieco lżejszy pod względem wymagań obliczeniowych i parsera, może być dobrym kompromisem.

+0

Zastanawiam się. Jeśli potrzebuję json bez tablic, czy to ułatwiłoby parsowanie? Świetna odpowiedź. To jest akceptowane dla mnie. –

3

Zwykle w takich przypadkach opłaca się dostosować format danych urządzenia. Na przykład w zależności od ograniczeń, z którymi mierzysz się w zakresie sieci lub rozmiaru pamięci, możesz skorzystać z kompresji strumieniowej lub preferować pełną kompresję. Ważnym czynnikiem jest również rodzaj danych, które chcesz przechowywać.

Jeśli naprawdę Twoim największym problemem jest łatwość analizowania, powinieneś przejść do xml, ale na wbudowanym urządzeniu łatwość parsowania jest zwykle znacznie mniejszym problemem w porównaniu do prędkości transferu, rozmiaru pamięci i zużycia procesora. JSON i YAML, podobnie jak XML, koncentrują się przede wszystkim na łatwości parsowania. Protobuf może się tam przecisnąć, binarne pakowanie jest tym, co zwykle robią ludzie.Szyfrowanie i kompresja raczej powinieneś robić na poziomie transportu, chociaż funkcjonalnie powinieneś dążyć do umieszczenia jak najmniejszej ilości informacji w wiadomości.

Wiem, że nie udzielę ci jednoznacznej odpowiedzi, ale myślę, że nie ma czegoś takiego w tak ogólnym pytaniu.

+0

Jednak myślę o OEM, które mogą wystąpić i na takich imprezach wolałbym czytelny format w formacie binarnym. Czy mogę po prostu utworzyć narzędzie, które konwertuje format binarny do formatu czytelnego? Jak nieefektywne jest parsowanie JSON lub YAML w porównaniu do rozpakowywania buforów binarnych? –

1

Jestem w trakcie wykonywania podobnej operacji odczytu danych z karty SD do wbudowanego procesora. Muszę pomyśleć o zwartości i łatwości tłumaczenia danych na karcie, w porównaniu do zdolności naszych filii i potencjalnych klientów do odczytu danych.

Narzędzia do konwersji mogą dać ci najlepszy kompromis, jeśli dane nie są często czytane przez ludzi, ale jeśli potrzebujesz narzędzi do konwersji, to będzie to dużo dodatkowego wsparcia (co jeśli nie działa na najnowszą wersję systemu Windows, Linux itp.).

Dla mojej sytuacji CSV okazuje się rozsądnym kompromisem dla mojej aplikacji ze względu na ilość łatwo dostępnych edytorów csv (jak excel) i tylko konieczność dostarczenia dokumentacji, jak produkować/edytować pliki CSV. CSV nie będąc w pełni zdefiniowanym standardem to ból, ale RFC4180 jest dobrym "standardem" csv do celu.

http://tools.ietf.org/html/rfc4180

Jako inna odpowiedź powiedział, że nie może dać jednoznaczne odpowiedzi, ale jak stwierdziliśmy, że będzie to kompromis pomiędzy konserwacji systemu przez każdą osobę, a szybkość i wielkość wbudowane rozwiązanie (tzn. działa!).

Powodzenia!

+0

Co z JSON/YAML jako formatem czytelnym dla ludzi? –

+0

Są one dość czytelne dla ludzi, ale nie mogę tak naprawdę przedstawiać ich opinii, ponieważ nigdy nie używałem JSON lub YAML. – fluffyben

2

CSV spełni twoje pragnienia zanim rozwiązanie oparte na XML. Bardzo łatwe do przeanalizowania, od jednego do dwóch tuzinów linii kodu. Następnie dodajesz, co oznaczają terminy/pola, których potrzebujesz do rozwiązania. Obciążenie CSV jest bardzo lekkie, niektóre przecinki i cytaty, w porównaniu do rozwiązania XML, w którym często znajduje się więcej znaczników XML i składni niż prawdziwe mięso/dane, dziesiątki do setek bajtów są często spalane dla pojedynczych wartości 8 lub 32 bitowych. Przyznany plik CSV ma również narzut, jeśli uważasz, że potrzeba trzech znaków (bajtów), aby reprezentować jedną wartość 8-bitową (przecinek heksadecymalny) w porównaniu do pliku binarnego. Nieskompresowane rozwiązanie XML ze swoją masą zużyje znacznie więcej pasma transmisji i pamięci masowej na dużych bibliotekach używanych do tworzenia i analizowania, a także kompresowania/dekompresji. CSV będzie łatwiejszy do odczytania niż binarny z pewnością i często łatwiejszy niż XML, ponieważ xml jest bardzo szczegółowy i nie można zobaczyć wszystkich powiązanych danych na jednym ekranie naraz. Każdy ma dostęp do dobrego narzędzia do arkuszy kalkulacyjnych, gnumeric, openoffice, ms office, dzięki czemu CSV jest dużo łatwiejszy w czytaniu/używaniu, gui już tam jest.

Nie ma jednak ogólnej odpowiedzi, trzeba wykonać na tym inżynierii systemu. Możesz bardzo chcieć mieć JSON/XML na hoście lub stronie dużego komputera i konwertować na jakiś inny format, jak binarny dla transmisji, a potem na stronie osadzonej może wcale nie potrzebujesz ASCII i nie musisz marnować energii na to, weź dane binarne i po prostu z niego skorzystaj. Ja również nie znam twojej definicji osadzonej, zakładam, że ponieważ mówisz o formatach ASCII, to nie jest to mikrokontroler z ograniczonym zasobem, ale prawdopodobnie wbudowany linux lub inny system operacyjny. Z perspektywy inżynierii systemowej, czego dokładnie potrzebuje system wbudowany iw jakiej formie? Na wyższym poziomie od tego, jakie zasoby posiadasz, a co za tym idzie, jaką formę mają zachować te dane w systemie wbudowanym, system wbudowany chce po prostu pobrać wstępnie sformatowany plik binarny i po prostu przekazać bajty bezpośrednio do dowolnego urządzenia peryferyjnego, które dane były przeznaczone? wbudowany sterownik może być bardzo głupi/prosty/niezawodny w tym przypadku, a większość pracy i debugowania jest po stronie hosta, gdzie jest mnóstwo zasobów i koni mechanicznych do formatowania danych. Chciałbym dążyć do minimalnego formatowania i narzutów, jeśli musisz dodać bibliotekę, aby je przetworzyć, prawdopodobnie go nie użyłbym. ale często pracuję z wbudowanymi systemami z ograniczoną dostępnością zasobów bez systemu operacyjnego.

+0

Serwer z pewnością akceptuje JSON lub YAML. Dlatego nie chciałbym dwa razy kodować protokołu komunikacyjnego. Używamy FPGA z procesorem Xilinx MicroBlaze. Będzie ograniczone zasoby, abyśmy mogli zdecydować o limicie. Potrzebujemy małych punktów końcowych, więc chcemy użyć jak najmniejszego sprzętu. –

+0

To pocieranie, kodowanie dwa razy nie musi być wielką sprawą, jeśli mówimy coś prostego, jak 10-20 linii kodu po każdej stronie, ból związany z uzyskaniem tego samego kodu w utworze do pracy może przesłonić nowy kod w czasie i wysiłku. Nie jestem pewien, co robi twoja wersja, ale na przykład twój kod i interfejs transferu mogą być tak proste, jak adres i dane (dla adresów rejestru lub pamięci w FPGA), kod osadzony jest niesamowicie głupi i prosty, wszystko co robi, to ściągnij adres i dane z magistrali i wykonać zapis. kod hosta wykonuje całą resztę pracy. –

+0

Wbudowane urządzenie steruje sprzętem zewnętrznym. Wszystko, co musi zrobić, to działać na żądanie serwera i ACK w przypadku awarii z kodem błędu lub sukcesem. –

2

Odpowiedź na pierwsze pytanie zależy w dużej mierze od tego, co próbujesz zrobić. Z tagów dołączonych do twojego pytania wynika, że ​​twoje punkty końcowe to systemy wbudowane, a twój serwer to jakiś komputer. Parsowanie XML na PC jest łatwe, ale w systemie wbudowanym jest nieco trudniejsze. Nie wspominasz również, czy twoja komunikacja jest dwukierunkowa, czy nie. Jeśli w twoim przypadku punkty końcowe przekazują tylko dane do serwera, ale nie odwrotnie, XML może działać dobrze. Jeśli serwer przekazuje dane do punktów końcowych, prawdopodobnie CSV lub zastrzeżony format binarny będą łatwiejsze do przeanalizowania w punkcie końcowym. Zarówno CSV, jak i XML są łatwo czytelne dla człowieka.

  • Czy transfery danych dwukierunkowy?
  • Czym jest transport fizyczny? (np. RS-232, Ethernet, USB?)
  • Czy dane są sformatowane jako pakiety lub strumienie?
  • Ile pamięci RAM ma punkt końcowy? Jak duże są twoje dane?
  • Czy punkt końcowy ma RTOS?
+0

Zobacz odpowiedź. Rozmyślnie nie wspomniałem o XML, ponieważ jest zbyt ciężki. A co z YAML/JSON/Protobufs/DSL? –

+0

Nie znam innych formatów danych. Po ich wyszukaniu wydają się tylko trochę lżejsze niż XML. Nie mogłem znaleźć żadnych informacji na temat DSL. – mjh2007

+0

DSL = Język specyficzny dla domeny –

3

Przede wszystkim zobacz, jakie rodzaje istniejących bibliotek możesz znaleźć. Nawet jeśli format jest trudny do przeanalizowania, wcześniejsza biblioteka może znacznie uatrakcyjnić format. Najłatwiejszy do przeanalizowania format to format, dla którego masz już parser.

Szybkość analizowania jest zwykle najlepsza w formatach binarnych. Jedną z najszybszych metod jest użycie "płaskiego" formatu binarnego (odczytujesz w buforze, przesyłasz wskaźnik do bufora jako wskaźnik do struktury danych i uzyskujesz dostęp do danych w buforze za pośrednictwem struktury danych). Nie jest konieczne prawdziwe "przetwarzanie", ponieważ przenosisz (zasadniczo) binarny zrzut regionu pamięci.

Aby zminimalizować ładunek, utwórz niestandardowy format binarny dostosowany do konkretnych potrzeb. W ten sposób możesz dostosować różne kompromisy konstrukcyjne do swoich największych zalet.

"Czytelna" jest subiektywna. Czytelny przez kogo? Proste formaty tekstu, takie jak XML i CSV, są łatwe do odczytania przez ludzi. Płaskie obrazy binarne są łatwe do odczytania przez maszyny.

Procedury szyfrowania zazwyczaj traktują dane jako skompresowane jako porcje danych binarnych (nie próbują wcale ich interpretować), więc szyfrowanie powinno mieć zastosowanie równie dobrze do danych dowolnego formatu.

Formaty tekstowe (XML, CSV, itp.) Wydają się być bardzo ściśliwe. Formaty binarne są mniej kompresowalne, ale mają mniej "zmarnowanych" bitów na początek.

W moich doświadczeń, miałem najlepsze wyniki z następującymi zasadami:

  • CSV - najlepiej, gdy dane są w sposób przewidywalny, spójny format. Przydaje się również w komunikacji z językiem skryptowym (gdzie tekstowe operacje we/wy mogą być łatwiejsze niż we/wy binarnym). Łatwo generowane/interpretowane ręcznie.
  • Płaskie binarne - Najlepsze, gdy transportujesz strukturę danych (POD) z jednego miejsca do drugiego. Aby uzyskać najlepsze wyniki, spakuj strukturę, aby uniknąć problemów z różnymi kompilatorami używającymi różnych wypełnień.
  • Format niestandardowy - zwykle najlepsze wyniki, ponieważ projektowanie niestandardowego formatu umożliwia zrównoważenie elastyczności, narzutów i czytelności. Niestety zaprojektowanie niestandardowego formatu od zera może okazać się znacznie bardziej pracochłonne, niż się wydaje.
+0

Oczywiście, jeśli projektujesz własny format, * dokumentuj go dokładnie *. Jeśli oczekujesz, że inne osoby będą używać tego kodu, podaj przykładowy kod, który zawiera prosty analizator składni i generator. – bta

+2

Re "zrzut binarny obszaru pamięci" - uważaj na problemy z endiancją i wyrównaniem. –

+0

+1 Posiadanie istniejących bibliotek do parsowania dla wszystkich urządzeń i użytkowników jest wygodne, zwłaszcza jeśli ma zdefiniowany standard, wtedy łatwiej jest je wspierać i lepiej udokumentować. – fluffyben

1

Z YAML website:

Zarówno JSON i YAML dążą do człowieka czytelne Data Interchange Format. Jednak, JSON i YAML mają różne priorytety . Najważniejszy projekt JSON-a celem jest prostota i uniwersalność. W ten sposób J SON jest trywialne do generowania i analizowania , kosztem zmniejszenia czytelności ludzkiej . Używa również najniższego modelu informacji o wspólnym mianowniku , zapewniając, że dane JSON będą łatwo przetwarzane przez każde nowoczesne środowisko programowania .

Natomiast wszystkim projektowanie cele yaml są ludzkie czytelność i wsparcie dla szeregowania arbitralnych rodzimych struktur danych. Tak więc, YAML pozwala na bardzo czytelne pliki, , ale jest bardziej złożony do generowania i analizy . Ponadto YAML przedsięwzięcia poza najniższym wspólnym mianownikiem typów danych, które wymagają bardziej złożonej przetwarzanie przy przekraczaniu pomiędzy różnych środowiskach programistycznych

Więc JSON jest znacznie lepiej, ponieważ jest to czytelny dla człowieka i efektywniejsza YAML.

1

Niedawno zaprojektowałem własny schemat serializacji do komunikacji z urządzeniami mobilnymi, tylko po to, aby moje wewnętrzne wydanie było zbieżne z publicznym ogłoszeniem Google protobufs. To było trochę rozczarowujące, ponieważ protokół Google'a był trochę lepszy. Radziłbym zajrzeć do tego.

Na przykład spójrz na proste liczby. Parsowanie JSON, XML lub CSV wymaga analizowania numerów ASCII. ASCII pobiera około 3,3 bitów na bajt; protobuf dostaje ciebie 7. Parsowanie ASCII wymaga szukania ograniczników i robienia matematyki, protobuf zajmuje tylko bitfiddling.

Wiadomości nie będą bezpośrednio czytelne z protobufem, oczywiście. Ale wizualizator jest szybko zhakowany; ciężka praca jest już wykonana przez Google.

+0

Czyli zasadniczo jest to to samo, co pakowanie/rozpakowywanie binarne, ale w czytelnym interfejsie API? Co dokładnie protobuf robi pod maską? –

+1

Bardzo, tak, tak. Zasadniczo protobuf (protokół) opisuje wydajną binarną reprezentację podstawowych struktur danych. Pod tym względem jest podobny do ASN.1. Na przykład liczby całkowite bez znaku są w zasadzie reprezentowane jako base-128, a bit top wskazuje "więcej bajtów do naśladowania". Podpisane liczby całkowite są takie same, z tym, że bit znaku jest teraz LSB - z kodowaniem o zmiennej długości pojęcie MSB jest rozmyte. Ważne szczegóły dotyczące skuteczności, ale ukryte przez interfejs API. – MSalters

Powiązane problemy