cache
en los problemas de GitHub, encontré algunos problemas en el caché pero no lo que estoy pidiendo.Estoy analizando un fragmento bastante pesado (500 KB) de texto proporcionado por el usuario usando una gramática de ~ 1000 líneas.
{cache: true}
...--max-old-space-size=3000
), el montón crece a 2.5GB y el análisis se realiza correctamente en 12 segundos.{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?
{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.¡Gracias por PEG.js! 🙂
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:
@ 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.