今日私はRAIDファイルのインデックスを更新するためにファイルシステムのインデックスを作成するために私のスクリプトを実行し、4時間後に次のエラーでクラッシュしました:
[md5:] 241613/241627 97.5%
[md5:] 241614/241627 97.5%
[md5:] 241625/241627 98.1%
Creating missing list... (79570 files missing)
Creating new files list... (241627 new files)
<--- Last few GCs --->
11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9 / 0 ms [allocation failure] [GC in old space requested].
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9 / 0 ms [allocation failure] [GC in old space requested].
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5 / 0 ms [last resort gc].
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6 / 0 ms [last resort gc].
<--- JS stacktrace --->
==== JS stack trace =========================================
Security context: 0x3d1d329c9e59 <JS Object>
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n >)
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin...
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
1: node::Abort() [/usr/bin/node]
2: 0xe2c5fc [/usr/bin/node]
3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node]
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node]
5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node]
6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node]
7: 0x3629ef50961b
サーバーには16 GB RAMおよび24 GB SSDスワップが装備されています。私のスクリプトが36ギガバイトのメモリを超えたことには疑いがありません。少なくともそれはいけません
スクリプトは、ファイルのメタデータ(変更日、権限など、ビッグデータなし)を持つオブジェクトの配列として格納されているファイルのインデックスを作成します。
これは完全なスクリプトコードです: http://Pastebin.com/mjaD76c3
私は過去にこのスクリプトで奇妙なノードの問題をすでに経験しています。 Stringのような大きなファイルを処理するときにノードがグリッチしていたので、インデックスを複数のファイルに分割しました。巨大なデータセットでnodejのメモリ管理を改善する方法はありますか?
私の記憶が正しければ、V8のメモリー使用量には、手動で増やさないのであれば、約1.7 GBという厳密な標準制限があります。
当社の製品の1つでは、デプロイスクリプトでこのソリューションに従いました。
node --max-old-space-size=4096 yourFile.js
ここで私が読んだように、新しいspaceコマンドもあるでしょう: ツアーv8ガベージコレクション 新しいスペースは新しく作成された短期データのみを集め、古いスペースはすべての参照されたデータ構造を含みますあなたの場合はこれが最善の選択肢であるはずです。
万が一誰かが直接ノードのプロパティを設定できない環境でこれに遭遇した場合(私の場合はビルドツール):
NODE_OPTIONS="--max-old-space-size=4096" node ...
コマンドラインで渡すことができない場合は、環境変数を使用してノードオプションを設定できます。
私はVSCodeでデバッグしようとしたときにこの問題に遭遇したので、単にこれを追加したいのはあなたがあなたのデバッグ設定に引数を追加する方法です。
あなたはそれをlaunch.json
のあなたの設定のruntimeArgs
プロパティに追加することができます。
下記の例をご覧ください。
{
"version": "0.2.0",
"configurations": [{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceRoot}\\server.js"
},
{
"type": "node",
"request": "launch",
"name": "Launch Training Script",
"program": "${workspaceRoot}\\training-script.js",
"runtimeArgs": [
"--max-old-space-size=4096"
]
}
]}
単一のスクリプトだけでなく、ノードのメモリ使用量をグローバルに増やす場合は、次のように環境変数をエクスポートできます。export NODE_OPTIONS=--max_old_space_size=4096
そうすれば、npm run build
のようなビルドを実行するときにファイルを操作する必要がなくなります。
私は--max-old-space-sizeを設定した後でもこれに苦労していました。
それから私はカルマスクリプトの前にオプション--max-old-space-sizeを置く必要性を実感しました。
私のスクリプトkarmaのために--max-old-space-sizeと--max_old_space_sizeの両方の構文を指定するのが最も良い:
node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192 --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192 --prod --aot
fwiw、 memwatch のようなものを使ってメモリを独占的に見つけ、修正することで解決するかもしれません。
修正する手順 -
%appdata%
と入力してEnterキーを押します。%appdata%
> npmフォルダに移動しますng.cmd
を開くか編集します--max_old_space_size=8192
を追加します変更後のnode.cmd
ファイルは、次のようになります。
@IF EXIST "%~dp0\node.exe" (
"%~dp0\node.exe" "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
) ELSE (
@SETLOCAL
@SET PATHEXT=%PATHEXT:;.JS;=;%
node "--max_old_space_size=8192" "%~dp0\node_modules\@angular\cli\bin\ng" %*
)
AOTアングルビルドをしている間に私は同様の問題を抱えていました。以下のコマンドが役に立ちました。
npm install -g increase-memory-limit
increase-memory-limit
出典: https://geeklearning.io/angular- aot-webpack-memory-trick/
ノードサーバの起動時にメモリを増やす方法に関する追加情報を追加するためのフラグ値をいくつか示します。
1GB - 8GB
#increase to 1gb
node --max-old-space-size=1024 index.js
#increase to 2gb
node --max-old-space-size=2048 index.js
#increase to 3gb
node --max-old-space-size=3072 index.js
#increase to 4gb
node --max-old-space-size=4096 index.js
#increase to 5gb
node --max-old-space-size=5120 index.js
#increase to 6gb
node --max-old-space-size=6144 index.js
#increase to 7gb
node --max-old-space-size=7168 index.js
#increase to 8gb
node --max-old-space-size=8192 index.js
nODE_OPTIONS = --max-old-space-size = 8192を試しました。
私のためにうまく働いています。
1つの提案:-
ターミナルでconsole.log()にコメントしようとしました。それもメモリを消費するからです。そして使用
ノードを最新バージョンにアップグレードしてください。私はこのエラーでノード6.6にいて8.9.4にアップグレードして問題は解決しました。
私は最近この同じ問題に直面し、このスレッドに出くわしましたが、私の問題はReact
Appにありました。 node startコマンドの以下の変更により、問題が解決しました。
node --max-old-space-size=<size> path-to/fileName.js
node --max-old-space-size=16000 scripts/build.js
基本的に、そのスレッドに割り当てられたメモリとノード設定によって異なります。
これは基本的にエンジンv8
にとどまります。以下のコードは、ローカルノードv8エンジンのヒープサイズを理解するのに役立ちます。
const v8 = require('v8');
const totalHeapSize = v8.getHeapStatistics().total_available_size;
const totalHeapSizeGb = (totalHeapSize / 1024 / 1024 / 1024).toFixed(2);
console.log('totalHeapSizeGb: ', totalHeapSizeGb);
念のため、大量のログを生成するnodejsアプリケーションを使用しているときにこの問題を抱えている人々を助けることができるかもしれないので、同僚は標準出力をファイルにパイプすることによってこの問題を解決しました。
プロジェクトディレクトリのwindows open powershellまたはcmdのヒープメモリを1 - 8 GBから増やし、そのディレクトリのmac open terminalの場合は、下記のコマンドを入力します。
node --max-old-space-size={size in MBs} index.js
私が試してみました ????以下のコードとその正常動作.
cmdを実行して新しいサイズを設定してください。
set NODE_OPTIONS = - max_old_space_size = 8172
またはあなたはより多くの情報のためにリンクをチェックすることができます https://github.com/nodejs/node/issues/10137#issuecomment-487255987
私の場合、以前のバージョンのnodeでnpm install
を実行していましたが、しばらくしていくつかのモジュールのためにnode versionとram npm install
をアップグレードしました。この後私はこのエラーを受けていました。この問題を解決するために、各プロジェクトからnode_moduleフォルダーを削除し、再度npm install
を実行しました。
これで問題が解決することを願っています。
注:これは私のローカルマシンで起こっていて、ローカルマシンだけで解決されました。
node
自体ではなく、他のソフト、たとえばwebpack
を起動しようとしている場合は、環境変数とcross-env
パッケージを使用できます。
$ cross-env NODE_OPTIONS='--max-old-space-size=4096' \
webpack --progress --config build/webpack.config.dev.js