Scrivere all'inizio di un file qualcosa che sai solo alla fine

9

Background: Sto scrivendo il codice C del microcontrollore per scrivere un file EBML. EBML è come un XML binario con elementi nidificati, ma al posto dei tag di inizio e fine, c'è un ID iniziale, la lunghezza e poi i dati. Sto scrivendo questo in Flash esterno in un'applicazione a bassa potenza, quindi mi piacerebbe mantenere gli accessi flash al minimo. Anche la memoria è limitata, perché niente è mai facile.

Quando posso mantenere l'intero elemento EBML in memoria, la sua generazione è facile perché posso tornare indietro e riempire la lunghezza di ogni elemento dopo aver saputo quale è la lunghezza. Il problema è cosa fare quando non riesco a tenere l'intero elemento in memoria. Le opzioni che vedo sono:

  • Scrivi quello che so, quindi torna indietro e aggiungi le lunghezze (più semplice, ma aggiunge più accesso flash di quanto non lo desideri)
  • Calcola la lunghezza di ciascun elemento prima di iniziare a scriverlo (relativamente facile, ma molto tempo per il processore)
  • Cambia modalità una volta che la memoria si è riempita, in modo tale che io continui attraverso i dati, ma solo per calcolare le lunghezze per gli elementi già riservati in memoria. Quindi scrivi ciò che ho in memoria e torna indietro e continua a elaborare i dati da dove ho lasciato. (La mia opzione preferita finora)
  • Fornisci agli elementi una lunghezza massima o peggiore dei casi quando devono essere scritti e la loro lunghezza finale non è ancora nota. (Più facile di quanto sopra, ma potrebbe ritorcersi contro e sprecare spazio)

Domanda: sembra che questo dovrebbe essere un problema relativamente comune a cui le persone hanno pensato. So che può succedere anche quando si formano alcuni pacchetti di dati. C'è una tecnica migliore / più comune / più accettata che mi manca qui? O solo alcuni termini per il problema che posso cercare?

    
posta pscheidler 09.08.2017 - 17:03
fonte

3 risposte

2

Se non sai quanto sarà lungo il tuo carico utile, raramente ti preoccupi anche se non ricordi la posizione e recuperai la lunghezza più tardi:

Prendi nota della "dimensione sconosciuta".

Questa caratteristica dipende dal carico utile costituito da elementi EBML e tuttavia il seguente elemento non è un elemento figlio valido.

Se lo desideri, puoi in seguito canonicalizzare l'EBML risultante offline come preferisci, ad esempio "senza dimensioni sconosciute, dimensione minima" o "dimensione minima, evitare dimensioni sconosciute".

Fai riferimento alla bozza RFC EBML su matroska.org per i dettagli.

    
risposta data 09.08.2017 - 20:06
fonte
0

Se un singolo elemento con un numero fisso di sottoelementi è troppo grande, forse dovresti provare a dividerlo nello schema. Non conosco questo formato, ma molto probabilmente puoi definire una lunghezza massima.

Per le sequenze potresti provare a definire il conteggio massimo dei sottoelementi e il "flusso" rimanente nel file successivo

Per gli elementi che potenzialmente superano le dimensioni massime della memoria preparare una pila contenente coppie: posizione della lunghezza dell'elemento riservata e contatore della lunghezza. Sul pop salva il contatore corrente nel marker corrente e aggiungi il suo valore al contatore successivo.

In generale, cerca di ridurre al minimo il numero degli elementi troppo grandi

    
risposta data 09.08.2017 - 22:47
fonte
0

KISS e YAGNI.
Scegli l'opzione n. 1 e se diventa un problema reale, solo allora ripetici.

Almeno per casi d'uso simili con formati binari simili, quando solo un paio di valori dovevano essere riempiti in tal modo, questa è la soluzione più semplice / più semplice / migliore. Se devi eseguire questa operazione su ogni singola porzione di dati, potrebbe essere un difetto nell'architettura.

    
risposta data 11.08.2017 - 08:42
fonte

Leggi altre domande sui tag