Pegjs: [質問] {cache:true}と妥当なメモリ不足のケースの処理に関するアドバイス

作成日 2018年11月22日  ·  3コメント  ·  ソース: pegjs/pegjs

問題の種類

  • 質問:はい

前提条件

  • 問題を再現できますか?:はい
  • リポジトリの問題を検索しましたか?:はい、GitHubの問題でcacheを調べましたが、キャッシュにいくつかの問題が見つかりましたが、私が求めているものではありません。
  • フォーラムを確認しましたか?:はい、 googlegroups / cacheを試し
  • ウェブ検索(グーグル、ヤフーなど)を実行しましたか?:はい

説明

約1000行の文法を使用して、ユーザーが提供したかなり重い(500KB)テキストを解析しています。

  • {cache: true}を渡すとき..。

    • ...そしてノードに3GBのヒープ( --max-old-space-size=3000を使用)を使用するように指示すると、ヒープは2.5GBに増加し、解析は12秒で成功します。

    • ...そしてノード10のデフォルトを800MBのヒープのままにしておくと、OOMで解析がクラッシュします。

  • {cache: false}を渡すと、予想どおり、クロックの解析は10秒でわずかに速くなり(非病理学的な場合)、メモリ使用量が膨らむことはありません。

これはユーザーデータであり、サーバーリソースが限られているため、ノードをバンプしてX GBのヒープを使用することはできません。明日は、X + 1GBのヒープを必要とする1MBのユーザーデータを取得する可能性があります。 そしてもちろん、私が出会った「病的な場合の指数関数的な解析時間を避ける」ために、可能な限り{cache: true}を使い続けたいと思います。

どのようなアプローチをお勧めしますか?

  • メモリ使用量が重要になったときに救済するためにPEG.jsに組み込まれているものはありますか?
  • タイムアウトを使用してこれを処理しようとする私の試みは、メモリ使用量がタイムアウトよりも速く増加する可能性があるため、あまり良くありません。
  • 私の知る限り、ノードOOMを傍受することは不可能です。
  • 最後に、入力のサイズに基づいて{cache: true}使用法を切り替えることを検討しています。 それは私により多くのCPU使用率を要します、しかし少なくとも私はOOMしません。
  • 他のアイデア?

PEG.jsをありがとう! 🙂

ソフトウェア

  • PEG.js: 0.10.0
  • Node.js: 10.13.0
  • NPMまたはヤーン: npm 6.4.1
  • ブラウザ: N / A
  • OS: AWS Linux
performance question

全てのコメント3件

指数関数的な構文解析時間は非常に病的な場合に発生するものであり、そこで文法を書き直すことをお勧めします。
https://github.com/sirthias/pegdown/issues/43#issuecomment-18469752を検討して
(私は寄稿者ではありません)

@ polkovnikov-phが指摘したように、病理学的なケースを扱う文法の部分を書き直すのが最善ですが、OOMケースをヒットし続ける場合は、あなた(@ronjouch)が提案したことを行う方が良いかもしれません。 入力のサイズに基づいて_cache_オプションを切り替えます: cache: input.length >= 250000

この後(ユーザーが提供したテキストにアクセスできる場合のみ)、OOMケースにヒットする入力を調べて一般的な病理学的ケースを見つけ、文法を更新してこれらを明示的に処理し、OOMケースの数を減らすことをお勧めします。あなたのアプリを打つ。

それでもOOMケースに頻繁に遭遇し、文法を書き直すだけでなく、ツールチェーンに追加のパス(またはいくつか)を追加することをいとわない場合は、次のいずれかの方法を試すことをお勧めします。

  • 大きな入力を分割し、解析している構文の一部を処理するように文法を更新してから、すべての入力部分が解析されたら、すべてを結合します(これは、生成されたパーサーがASTを返す場合にのみ実行可能である可能性が高く、そうでない場合は不明です)
  • 正規表現を使用して、生成された2つのパーサーのいずれかに送信する前に病理学的ケースにつながる可能性のあるユーザー提供テキストの構文を識別します。1つは通常のパーサーで、もう1つは病理学的ケースを処理します。
  • いつでもPEG.js文法を使用して、トークナイザーのように動作するパーサーを生成し、通常の入力と、病的なケースにつながる可能性のある構文を含む入力の両方を最適に解析できるパーサーを構築できます(より多くの時間を投資する必要があります)パーサーについて学び、パーサージェネレーターの目的を損なうようなものですが、_自分が何をしているのかを知っていれば、ほとんどの場合実行可能なオプションです_)

@ polkovnikov-ph @futagozaアドバイスをお返しするために時間を

このページは役に立ちましたか?
0 / 5 - 0 評価