1. ホーム
  2. node.js

[解決済み] FATAL ERROR: CALL_AND_RETRY_LAST 割り当てに失敗しました - プロセスのメモリが不足しています。

2022-04-15 06:06:56

質問

ノードのバージョンは v0.11.13

クラッシュ時のメモリ使用量 sudo top を超えることはありません。 3%

このエラーを再現するコードです。

var request = require('request')
var nodedump = require('nodedump')

request.get("http://pubapi.cryptsy.com/api.php?method=marketdatav2",function(err,res)
{
    var data
    console.log( "Data received." );
    data = JSON.parse(res.body)
    console.log( "Data parsed."   );
    data = nodedump.dump(data)
    console.log( "Data dumped."   ); 
    console.log( data )
})

再帰のスタックサイズの問題かどうかを確認するために、次のコードを --stack-size=60000 パラメータ付きで実行しました。

var depth = 0;

(function recurse() {
    // log at every 500 calls
    (++depth % 500) || console.log(depth);
    recurse();
})();

となっています。

264500 
Segmentation fault

それからコードを実行すると、FATAL ERRORが表示されました。CALL_AND_RETRY_LAST 割り当てに失敗しました - 同じ --stack-size=60000 パラメータでメモリ不足のプロセスを実行しても、次のようになりません。 Segmentation fault .

というわけで、結論は CALL_AND_RETRY_LAST は、再帰のスタックサイズと共通点がない。

どうすればこの問題を解決できるのでしょうか?私のコンピュータには、このタスクを成功させるのに十分な空きメモリがあると思います。

stackoverflowにも似たような質問がありますが、この質問はどれも CALL_AND_RETRY_LAST というわけで、別の質問を作りました。

どのように解決するのですか?

ソースをご覧いただくと github/v8 私の経験では、巨大なJSONオブジェクトをパースしようとするとそうなりますが、JSONとnode0.11.13であなたの出力をパースしようとすると、それはちょうどうまくいきます。

を増やす必要はありません。 --stack-size メモリはもっと必要です。 --max_new_space_size および/または --max_old_space_size .

唯一のヒントは、別のJSONパーサーを試すか、入力形式をJSONのみではなくJSONラインに変更してみることです。