1

私は NodeJS の GET URL API からたくさんのものをかき集めています。私は、年の X 都市の数の月をループしています。{startDate: ..., endDate: ..., location:...} など、パラメーターのインスタンスごとに 1 回呼び出す、scrapeChunk() 関数があります。内部では、テーブルの jsdom 解析を行い、CSV に変換し、CSV をファイルに追加します。ネストされたすべての非同期コールバック内で、最終的に次のパラメーター インスタンスを使用して、scrapeChunk 関数を再度呼び出します。

それはすべて機能しますが、「FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory」エラーが発生するまで、ノード インスタンスは RAM 内で成長し続けます。

私の質問: 何か間違ったことをしていますか、それとも JavaScript や使用しているライブラリの制限ですか? どうにかして各タスクを完了させ、そのメモリを解放してから、次のタスクを開始できますか? FuturesJS のシーケンスを試してみましたが、同じリークに悩まされているようです。

4

4 に答える 4

4

おそらく起こっていることは、非常に深い呼び出しツリーを構築していて、そのツリーの上位レベルがデータへの参照を保持しているため、ガベージ コレクターによって要求されないことです。

やるべきことの 1 つは、独自のコードで、最後にコールバックを呼び出すときに、 を呼び出すことprocess.nextTick();です。そうすれば、呼び出し元の関数を終了してその変数を解放できます。また、それらの参照を永久に保持するグローバル構造にすべてのデータを積み上げていないことを確認してください。

コードを見ないと、適切な応答を思いつくのは少し難しいです。しかし、これは node.js やそのアプローチ (それを使用する長時間実行される複雑なアプリケーションがたくさんあります) の制限ではなく、それをどのように利用するかです。

于 2013-06-04T23:00:32.237 に答える
2

JSDom の代わりに、cheerioを試してみてください。著者は、よりスリムで 8 倍高速であると主張しています。

于 2013-06-07T06:54:26.097 に答える