visto che la mole di dati probabilmente non ti starà in memoria, la soluzione è avere un piccolo buffer circolare; immagino che ci sia un tag particolare che cerchi per individuare l'inizio e la fine dei messaggi che ti interessano.
a questo punto hai 2 stati da gestire:
stato 1: riempi len(tagInizio) buffer e cerchi il tag di inizio. Se lo trovi carichi il buffer fino a quando il tag di inizio non ne esca ed entri nello stato 2
stato 2: cerchi il tag di fine. copi il contenuto del buffer fino alla fine o all'eventiale tag di fine in una string. Se hai trovato il tag di fine, elimina l'eventuale parziale di tag fine ed elabora la stringa ed entra nello stato 1. se non la trovi, riempi il buffer di len(tagFine) (ricordati da dove sei arrivato a salvare eh!) e ricomincia lo stato 2
in questo modo con un piccolo buffer (grande almeno quanto il massimo tra la lungheza id tag di inizio e di tag fine) sei in grado di leggere infiniti mesaggi. Sta a te a questo punto fare in modo che i mesaggio salvato durante la fase 2 non sfondi la ram. per esempio puoi dire che a priori lo stato 2 non può leggere più di X lettere, e quindi esce anche in caso di tag fine on trovato ma limite raggiunto.
oppure non salvi ed elabori la stringa completa, ma elabori ad ogni stato2 la stringa parziale col rischio però di elaborare anche il tag fine quando ti arriva parziale. per eliminare il problema ad ogni lettura viene eseguita la stringa precedente se il tag fine non viene trovato, altrimenti si triggera il cambio stato a 1 che si occupa di eliminare il tag fine e ricrearti il partziale del turno precedente+questo turno pulito del tag