Ho un file di log enorme in questo tipo di struttura:Come leggere un file a ritroso per trovare sottostringa efficiente
"timestamp": { "identificatore": valore}
"1463403600":{"AA":74.42},
"1463403601":{"AA":29.55},
"1463403603":{"AA":24.78},
"1463403604":{"AA":8.46},
"1463403605":{"AA":44.84},
"1463403607":{"AA":87.05},
"1463403608":{"AA":54.81},
"1463403609":{"AA":93.1},
"1463403611":{"AA":77.64},
"1463403612":{"AA":33.39},
"1463403613":{"AA":69.2},
voglio estrarre il contenuto dopo un dato timestamp come (!):
std::ifstream * myfunc(uint32_t timestamp)
esempio:
myfunc(1463403611);
/* returns
"1463403611":{"AA":77.64},
"1463403612":{"AA":33.39},
"1463403613":{"AA":69.2},
*/
Il file di log è troppo lungo per conservarlo in memoria. Il codice verrà eseguito su dispositivi embedded con risorse limitate (80 Mhz, ~ 10kB di memoria libera), quindi sto cercando alcune idee per una soluzione efficace.
Il file di registro potrebbe avere voci di 500k + e nel 99% del tempo il timestamp sarà nelle ultime 100 righe, quindi partire dall'inizio del file e verificare che ogni riga per il timestamp giusto sarebbe molto inefficiente.
Quindi suppongo che sto cercando una soluzione per leggere il file all'indietro, riga per riga. Non ho davvero una soluzione su come farlo in modo efficiente senza caricare grandi blocchi in memoria.
Ho provato a leggere in blocchi di 200 byte a partire dall'EOF, ma ho dovuto affrontare il problema, che il blocco tagliava in due il timestamp in molti casi. Ho provato a rilevarlo e selezionare nuovamente alcuni byte se necessario, ma ho avuto la sensazione che ci debba essere una soluzione smarte.
1) Con la creazione di file timestamp, il file l'ultima volta modificato il timbro, numero di timestamp al giorno, si può essere in grado di approssimare l'offset, quindi regolare la stima da parte lettura. 2) con "99% del tempo ...", dovrebbe essere facile approssimare un offset iniziale. –
È possibile trovare il record utilizzando un algoritmo di tipo di ricerca binario mirato verso la fine del file. – Galik
Non è necessario leggere grandi blocchi, il buffer deve essere appena più grande del doppio della riga più lunga possibile. Nel tuo esempio, sembra che quelle linee sarebbero sempre piuttosto piccole; Probabilmente farebbe un buffer da 64 byte. –