cache
,在缓存中发现了一些问题,但不是我所要求的。我正在使用大约 1000 行的语法解析一段相当重 (500KB) 的用户提供的文本。
{cache: true}
...--max-old-space-size=3000
),堆增长到 2.5GB,并在 12 秒内解析成功。{cache: false}
,正如预期的那样,解析时钟在 10 秒(非病理情况)时稍微快一点,并且不会增加内存使用量。这是用户数据,而我的服务器资源有限,因此无法让 Node 使用 X GB 的堆,因为明天我可能会获得 1MB 的用户数据,而这需要 X+1 GB 的堆。 当然,我想在可能的情况下继续使用{cache: true}
,以“避免病理情况下的指数解析时间” ,这是我遇到的。
你推荐什么方法?
{cache: true}
的用法。 这将花费我更多的 CPU 使用率,但至少我不会 OOM。感谢 PEG.js! 🙂
指数解析时间是在非常病态的情况下发生的事情,我建议在那里重写语法。
考虑https://github.com/sirthias/pegdown/issues/43#issuecomment -18469752
(我不是贡献者)
正如@polkovnikov-ph 指出的那样,最好重写处理病理情况的部分语法,但是如果您继续遇到 OOM 情况,那么按照您(@ronjouch)的建议进行操作可能会更好; 根据输入的大小切换 _cache_ 选项: cache: input.length >= 250000
在此之后(并且仅当您可以访问用户提供的文本时),我建议检查任何遇到 OOM 案例的输入以定位任何常见的病理案例并更新您的语法以明确处理这些,以便您可以减少 OOM 案例的数量打你的应用程序。
如果您仍然经常遇到 OOM 情况,并且愿意不仅重写您的语法,还愿意为您的工具链添加一个额外的(或几个)通过,我建议您尝试以下任何一种方法:
@polkovnikov-ph @futagoza感谢你们两人抽出时间回来提出建议👍! 这就说得通了。 我部署了大小解决方法,下次麻烦敲门时会考虑重写语法。 再会; 结束问题。