2012-09-13 9 views
5

¿Es posible decirle a pyparsing que no almacene ParseResults o que los descarte manualmente?¿Cómo descartar pyparsing parseResults durante el análisis?

Estoy analizando un archivo grande de elementos y puedo hacer todo el postprocesamiento de cada elemento mediante una acción de análisis. Entonces, tan pronto como un elemento ha sido analizado, ya no necesito que sea ParseResult y me gustaría poder descartarlo ya que estoy alcanzando el límite de memoria de la máquina en la que estoy.

Respuesta

4

¿Está utilizando acciones de análisis para procesar los tokens a medida que se analizan? Si es así, puede borrar el contenido de las fichas analizados utilizando del:

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

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

O es posible que desee sólo tiene que utilizar en lugar de scanStringparseString. En lugar de esto:

OneOrMore(blockOfText).parseString(bigHonkingString) 

hacer:

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

scanString devuelve un generador que produce 3-tuplas que contienen las fichas emparejados, el arranque, y terminando ubicación de cada partido sucesivo. Puede procesar cada conjunto de tokens analizados, y luego cuando pase al siguiente conjunto, el conjunto anterior se descarta automáticamente. Creo que esta puede ser la forma más sencilla de ir, con cambios mínimos en su programa.

+0

Sí, eso es lo que estoy haciendo. Usar 'del' para hacerlo yo mismo debería haberme ocurrido pero tienes razón, scanString es mucho más ordenado. Es bueno saber que pyparsing tiene esta característica. ¡Gracias! – nedned

+0

Paul, ¿'.suppress()' ing la frase aún mantiene los contenidos en la memoria después de que se haya ejecutado 'parseAction'? – Hooked

+0

No: si se suprime una expresión, su contenido no se guarda mediante pyparsing. – PaulMcG