2012-09-13 8 views
5

È possibile indicare a Pyparsing di non memorizzare ParseResults o eliminarli manualmente?Come scartare i parseResults di pyparsing durante l'analisi?

Sto analizzando un grande file di elementi e posso eseguire tutte le operazioni di post-elaborazione per ciascun elemento tramite un'azione di analisi. Quindi, non appena un oggetto è stato analizzato, non ho più bisogno di ParseResult e vorrei essere in grado di scartarlo mentre sto colpendo il limite di memoria della macchina su cui sto lavorando.

risposta

4

Stai utilizzando le azioni di analisi per elaborare i token mentre vengono analizzati? Se è così, è possibile eliminare il contenuto dei gettoni analizzati utilizzando del:

def parseActionThatDeletesTheParsedTokens(tokens): 
    # ... 
    # do something interesting with the tokens 
    # ... 

    # delete the contents of the parsed tokens 
    del tokens[:] 

Oppure si potrebbe desiderare di utilizzare solo scanString invece di parseString. Invece di questo:

OneOrMore(blockOfText).parseString(bigHonkingString) 

fare:

for tokens, matchstart, matchend in blockOfText.scanString(bigHonkingString): 
    # do stuff with the tokens 

scanString restituisce un generatore che produce 3-tuple contenenti i token abbinati, l'avviamento e termina posizione di ogni partita successiva. È possibile elaborare ogni insieme di token analizzato, quindi quando si passa al set successivo, il vecchio set viene automaticamente scartato. Penso che questo potrebbe essere il modo più semplice per te di andare, con modifiche minime al tuo programma.

+0

Sì, è quello che sto facendo. Usare 'del' per farlo da solo dovrebbe essermi verificato, ma hai ragione, scanString è molto più ordinato. È bello sapere che il pyparsing ha questa caratteristica. Grazie! – nedned

+0

Paul, '' .suppress() '' la frase conserva ancora il contenuto in memoria dopo che è stato eseguito 'parseAction'? – Hooked

+0

No - se un'espressione viene soppressa, il suo contenuto non viene salvato da pyparsing. – PaulMcG