Pegjs: [question] Saran tentang {cache: true} dan penanganan kasus kehabisan memori yang wajar

Dibuat pada 22 Nov 2018  ·  3Komentar  ·  Sumber: pegjs/pegjs

Jenis masalah

  • Pertanyaan: ya

Prasyarat

  • Bisakah Anda mereproduksi masalah?: ya
  • Apakah Anda mencari masalah repositori?: ya, melihat cache dalam masalah GitHub, menemukan beberapa masalah pada cache tetapi bukan yang saya minta.
  • Apakah Anda memeriksa forum?: ya, mencoba googlegroups / cache , tidak ada hasil terkait
  • Apakah Anda melakukan pencarian web (google, yahoo, dll)?: ya

Keterangan

Saya mem-parsing bagian yang cukup berat (500KB) dari teks yang disediakan pengguna menggunakan tata bahasa ~1000 baris.

  • Saat melewati {cache: true} ...

    • ... dan memberi tahu Node untuk menggunakan tumpukan 3GB (dengan --max-old-space-size=3000 ), tumpukan bertambah menjadi 2,5 GB, dan penguraian berhasil dalam 12 detik.

    • ... dan membiarkan Node 10 default ke tumpukan 800MB, parsing macet dengan OOM.

  • Saat melewati {cache: false} , seperti yang diharapkan, parsing jam sedikit lebih cepat pada 10-an (kasus non-patologis) dan tidak menggembungkan penggunaan memori.

Ini adalah data pengguna dan sumber daya server saya terbatas, jadi menabrak Node untuk menggunakan tumpukan X GB bukanlah pilihan, karena besok saya mungkin mendapatkan data pengguna 1MB yang akan membutuhkan tumpukan X+1 GB. Dan tentu saja saya ingin tetap menggunakan {cache: true} bila memungkinkan, untuk " menghindari waktu penguraian eksponensial dalam kasus patologis" , yang saya temui.

Pendekatan apa yang Anda rekomendasikan?

  • Apakah ada sesuatu yang dibangun ke dalam PEG.js untuk menyelamatkan saat penggunaan memori menjadi kritis?
  • Upaya saya untuk menangani ini dengan batas waktu tidak bagus, karena penggunaan memori mungkin tumbuh lebih cepat daripada batas waktu.
  • Sejauh yang saya tahu tidak mungkin untuk mencegat Node OOM.
  • Akhirnya, saya mempertimbangkan untuk mengalihkan penggunaan {cache: true} berdasarkan ukuran input. Itu akan menghabiskan lebih banyak penggunaan CPU, tetapi setidaknya saya tidak akan OOM.
  • Ide lain?

Terima kasih untuk PEG.js! 🙂

Perangkat lunak

  • PEG.js: 0.10.0
  • Node.js: 10.13.0
  • NPM atau Benang: npm 6.4.1
  • Peramban: T/A
  • OS: AWS Linux
performance question

Semua 3 komentar

Waktu penguraian eksponensial adalah sesuatu yang terjadi dalam kasus yang sangat patologis, dan saya akan merekomendasikan untuk menulis ulang tata bahasa di sana.
Pertimbangkan https://github.com/sirthias/pegdown/issues/43#issuecomment -18469752
(Saya bukan kontributor)

Seperti yang ditunjukkan oleh @polkovnikov-ph, yang terbaik adalah menulis ulang bagian tata bahasa Anda yang berhubungan dengan kasus patologis, tetapi jika Anda terus menekan kasus OOM, mungkin lebih baik untuk melakukan apa yang Anda (@ronjouch) sarankan; alihkan opsi _cache_ berdasarkan ukuran input: cache: input.length >= 250000

Setelah ini (dan hanya jika Anda memiliki akses ke teks yang disediakan pengguna), saya akan menyarankan untuk memeriksa input apa pun yang mengenai kasus OOM untuk menemukan kasus patologis umum dan memperbarui tata bahasa Anda untuk secara eksplisit menangani ini sehingga Anda dapat mengurangi jumlah kasus OOM memukul aplikasi Anda.

Jika Anda masih sering menggunakan kasus OOM, dan bersedia untuk tidak hanya menulis ulang tata bahasa Anda, tetapi juga menambahkan pass tambahan (atau sedikit) ke rantai alat Anda, saya sarankan untuk mencoba salah satu metode ini:

  • membelah input besar, dan memperbarui tata bahasa Anda untuk menangani sebagian dari sintaks yang Anda parsing, lalu ketika semua bagian input diuraikan, gabungkan semuanya (ini kemungkinan besar hanya layak jika parser yang Anda hasilkan mengembalikan AST, tidak yakin sebaliknya)
  • gunakan regex untuk mengidentifikasi sintaks dalam teks yang disediakan pengguna yang dapat mengarah ke kasus patologis sebelum mengirimnya ke salah satu dari 2 parser yang dihasilkan: satu parser normal dan satu lagi untuk menangani kasus patologis
  • Anda selalu dapat menggunakan tata bahasa PEG.js untuk menghasilkan parser yang berperilaku seperti tokenizers, dan membangun parser yang dapat secara optimal mengurai kedua input normal, dan input yang berisi sintaks yang dapat menyebabkan kasus patologis (akan mengharuskan Anda untuk menginvestasikan lebih banyak waktu dalam belajar tentang parser, dan jenis mengalahkan tujuan generator parser, tetapi _hampir selalu merupakan pilihan yang layak jika Anda tahu apa yang Anda lakukan_)

@polkovnikov-ph @futagoza terima kasih kepada kalian berdua karena telah meluangkan waktu untuk kembali dengan saran 👍! Itu masuk akal. Saya menggunakan solusi ukuran, dan akan mempertimbangkan untuk menulis ulang tata bahasa lain kali masalah mengetuk pintu. Selamat tinggal; menutup pertanyaan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

futagoza picture futagoza  ·  6Komentar

emmenko picture emmenko  ·  15Komentar

dmajda picture dmajda  ·  7Komentar

dmajda picture dmajda  ·  15Komentar

mikeaustin picture mikeaustin  ·  7Komentar