Innanzitutto, sappi che std :: list è una cattiva scelta per questo genere di cose, in particolare per quanto riguarda la lettura. Il motivo è che gli elementi std :: list non sono garantiti come contigui, rendono molto più lento andare da elemento a elemento a causa di errori di cache (e della mancanza di un comportamento prevedibile di accesso alla memoria).
Sarei te, la prima cosa che proverei sarebbe sostituire la std :: list con uno std :: vector, con una call da riservare prima di iniziare a spingere gli elementi indietro, per riservare molta memoria dall'inizio ed evitare allocazioni.
Se usi C ++ 11, usa la funzione emplace_back () invece di push_back () per evitare definitivamente copie non necessarie dell'oggetto elemento.
Il vettore ha una memoria contigua che garantirà un accesso rapido alla lettura della sessione e sarà più efficiente in termini di memoria perché gli elementi sono sempre vicini: non c'è frammentazione della memoria.
Se ciò non è sufficiente, considera l'utilizzo di qualcosa come SQLite. Non sostituisce l'accesso in memoria, ma è possibile utilizzare la coppia di std :: array dei record come doppio buffer in cui inserire il successivo batch di record da leggere che si estrae progressivamente dal file sqlite. Per scrivere, basta fare inserti. Sia la lettura che la scrittura possono essere eseguite in un thread separato mentre l'applicazione continua a essere in esecuzione o sta elaborando i record in riproduzione.
Il motivo per cui questa configurazione potrebbe aiutare è che farebbe sì che qualsiasi dimensione della sessione non abbia impatto (o quasi) sull'applicazione che la riproduce, perché in memoria ci sarebbe solo una parte dell'intera sessione leggibile, rendendo il runtime non crescente sulla memoria, rendendo le cose veloci. In questo caso sarai limitato solo dalla velocità di accesso al disco, motivo per cui suggerisco di utilizzare una lettura (simultanea) a doppio buffer dei record. Comunque sqlite è fatto per essere molto veloce.