Tło: Piszę kod C mikrokontrolera, aby zapisać plik EBML. EBML jest jak binarny XML z zagnieżdżonymi elementami, ale zamiast znaczników początkowego i końcowego istnieje identyfikator początkowy, długość, a następnie dane. Piszę to w zewnętrznej pamięci Flash w aplikacji o niskiej mocy, więc chciałbym ograniczyć dostęp do lampy błyskowej do minimum. Pamięć jest również ograniczona, ponieważ nic nigdy nie jest łatwe.
Kiedy mogę zachować cały element EBML w pamięci, wtedy generowanie go jest łatwe, ponieważ mogę wrócić i wypełnić długość każdego elementu po tym, jak wiem, jaka jest ta długość. Problem polega na tym, co zrobić, gdy nie mogę utrzymać całego elementu w pamięci. Opcje, które widzę to:
- Napisz, co wiem, a następnie wróć i dodaj długości (najłatwiej, ale dodaje więcej dostępu flash niż chcę)
- Oblicz długość każdego elementu, zanim zacznę go pisać (stosunkowo łatwo, ale dużo czasu procesora)
- Przełączaj tryby, gdy moja pamięć się zapełni, aby kontynuować dane, ale tylko w celu obliczenia długości elementów już zarezerwowanych w pamięci. Następnie napisz, co mam w pamięci, i wróć i kontynuuj przetwarzanie danych od miejsca, w którym przestałem. (Moja ulubiona jak dotąd opcja)
- Podaj elementom maksymalną lub najgorszą długość przypadku, gdy trzeba je napisać, a ich ostateczna długość nie jest jeszcze znana. (Łatwiej niż powyżej, ale może spowodować pożar i marnować miejsce)
Pytanie: Wydaje się, że powinien to być dość powszechny problem, o którym ludzie myśleli. Wiem, że może się to zdarzyć również podczas tworzenia niektórych pakietów danych. Czy brakuje mi lepszej / bardziej powszechnej / bardziej akceptowanej techniki? A może tylko niektóre terminy dotyczące problemu, który mogę wyszukać?
źródło
Odpowiedzi:
Jeśli nie wiesz, jak długo będzie trwała ładowność, rzadko jest to powodem do zmartwień, nawet jeśli nie pamiętasz pozycji i zapełnisz ją później:
Po prostu zanotuj „nieznany rozmiar”.
Ta funkcja zależy od ładunku składającego się z elementów EBML i następującego elementu, który nie jest prawidłowym elementem potomnym.
Jeśli chcesz, możesz później kanonizować wynikowy EBML offline w dogodny dla siebie sposób, w dowolny sposób, na przykład „bez nieznanych rozmiarów, minimalny rozmiar” lub „minimalny rozmiar, unikaj nieznanych rozmiarów”.
Szczegółowe informacje można znaleźć w wersji roboczej EBML RFC na stronie matroska.org.
źródło
Jeśli pojedynczy element ze stałą liczbą podelementów jest zbyt duży, być może powinieneś spróbować podzielić go na schemat. Nie znam tego formatu, ale najprawdopodobniej możesz zdefiniować w nim maksymalną długość.
W przypadku sekwencji można spróbować zdefiniować maksymalną liczbę podelementów i „strumień” pozostały w następnym pliku
Dla elementów potencjalnie przekraczających maksymalny rozmiar pamięci przygotuj stos zawierający pary: położenie zarezerwowanej długości elementu i licznik długości. Po popie zapisz bieżący licznik w bieżącym znaczniku i dodaj jego wartość do następnego licznika.
Ogólnie staraj się minimalizować liczbę zbyt dużych elementów
źródło
KISS i YAGNI.
Wybierz opcję 1, a jeśli stanie się to prawdziwym problemem - tylko wtedy powtórz ją.
Przynajmniej dla podobnych przypadków użycia z podobnymi formatami binarnymi, gdy tylko kilka wartości musiało być wypełnionych w taki sposób, jest to najprostsze / najłatwiejsze / najlepsze rozwiązanie. Jeśli musisz to zrobić na każdym fragmencie danych - może to być wada w architekturze.
źródło