Pegjs: [pregunta] Consejos sobre {cache: true} y manejo de casos razonables de falta de memoria

Creado en 22 nov. 2018  ·  3Comentarios  ·  Fuente: pegjs/pegjs

Tipo de problema

  • Pregunta: si

Prerrequisitos

  • ¿Puedes reproducir el problema ?: si
  • ¿Buscaste los problemas del repositorio ?: sí, miré cache en los problemas de GitHub, encontré algunos problemas en el caché pero no lo que estoy pidiendo.
  • ¿Revisaste los foros?: Sí, probé googlegroups / cache , sin resultados relacionados
  • ¿Realizó una búsqueda en la web (google, yahoo, etc.) ?:

Descripción

Estoy analizando un fragmento bastante pesado (500 KB) de texto proporcionado por el usuario usando una gramática de ~ 1000 líneas.

  • Al pasar {cache: true} ...

    • ... y diciéndole a Node que use 3GB de montón (con --max-old-space-size=3000 ), el montón crece a 2.5GB y el análisis se realiza correctamente en 12 segundos.

    • ... y dejando el nodo 10 predeterminado en 800 MB de montón, analizando bloqueos con un OOM.

  • Al pasar {cache: false} , como se esperaba, el análisis de los relojes es un poco más rápido a los 10 segundos (caso no patológico) y no aumenta el uso de la memoria.

Estos son datos de usuario y los recursos de mi servidor son limitados, por lo que hacer que Node use X GB de montón no es una opción, ya que mañana podría obtener 1 MB de datos de usuario que requerirían X + 1 GB de montón. Y, por supuesto, me gustaría seguir usando {cache: true} cuando sea posible, para "evitar el tiempo de análisis exponencial en casos patológicos" , que he conocido.

¿Qué enfoque recomiendas?

  • ¿Hay algo integrado en PEG.js para rescatar cuando el uso de la memoria se vuelve crítico?
  • Mis intentos de manejar esto con tiempos de espera no son excelentes, ya que el uso de la memoria puede crecer más rápido que el tiempo de espera.
  • Hasta donde yo sé, es imposible interceptar un nodo OOM.
  • Finalmente, estoy considerando cambiar el uso de {cache: true} función del tamaño de la entrada. Eso me costará más uso de CPU, pero al menos no lo haré OOM.
  • ¿Otras ideas?

¡Gracias por PEG.js! 🙂

Software

  • PEG.js: 0.10.0
  • Node.js: 10.13.0
  • NPM o hilo: npm 6.4.1
  • Navegador: N / A
  • SO: AWS Linux
performance question

Todos 3 comentarios

Los tiempos de análisis exponencial es algo que sucede en casos muy patológicos, y recomendaría reescribir la gramática allí.
Considere https://github.com/sirthias/pegdown/issues/43#issuecomment -18469752
(No soy colaborador)

Como señaló @ polkovnikov-ph, es mejor reescribir partes de su gramática que tratan con casos patológicos, pero si continúa atacando casos OOM, podría ser mejor hacer lo que sugirió (@ronjouch); alternar la opción _caché_ según el tamaño de la entrada: cache: input.length >= 250000

Después de esto (y solo si tiene acceso al texto proporcionado por el usuario), sugeriría examinar cualquier entrada que afecte a los casos de OOM para localizar cualquier caso patológico común y actualizar su gramática para manejarlos explícitamente para que pueda reducir el número de casos de OOM golpeando su aplicación.

Si todavía tiene casos de OOM con frecuencia y está dispuesto no solo a reescribir su gramática sino también a agregar un pase adicional (o algunos) a su cadena de herramientas, le sugiero que pruebe alguno de estos métodos:

  • dividiendo la entrada grande y actualizando su gramática para manejar partes parciales de la sintaxis que está analizando, luego, cuando se analicen todas las piezas de entrada, únase todo (esto probablemente solo sea viable si su analizador generado devuelve AST, no estoy seguro de lo contrario)
  • use una expresión regular para identificar la sintaxis en el texto proporcionado por el usuario que podría conducir a casos patológicos antes de enviarlo a uno de los 2 analizadores generados: un analizador normal y otro para manejar casos patológicos
  • siempre puede usar la gramática PEG.js para generar un analizador que se comporte como tokenizadores y compile un analizador que pueda analizar de manera óptima tanto las entradas normales como las entradas que contienen sintaxis que pueden conducir a casos patológicos (requerirá que invierta más tiempo en aprender acerca de los analizadores, y en cierto modo frustra el propósito de un generador de analizadores, pero _es casi siempre una opción viable si sabe lo que está haciendo_)

@ polkovnikov-ph @futagoza ¡ gracias a ambos por tomarse el tiempo para volver con un consejo 👍! Eso tiene sentido. Implementé la solución de tamaño y consideraré reescribir la gramática la próxima vez que un problema llame a la puerta. Buenos días; cerrando la pregunta.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

emmenko picture emmenko  ·  15Comentarios

futagoza picture futagoza  ·  13Comentarios

dmajda picture dmajda  ·  20Comentarios

audinue picture audinue  ·  13Comentarios

ceymard picture ceymard  ·  32Comentarios