落ちてる原因って本当にメモリ不足なんですかね?
そりゃいつかはメモリ解放出来ずに死ぬとは思いますが、
これ再帰関数みたいな無限ループみたいになってて
スコープを作り続けるから5桁回数回るくらいまででエラー吐いて落ちるんじゃないですか?
さて、解決にあたってですが
setInterval
が使えれば話は早いですが、
update処理の実行にもたつくと2回、3回と溜まってしまうのが悩みどころ
コールバック関数の仕組みだけで
このパターンを解消するのはちとしんどいですね。
骨子はこんな感じ?
js
1const id = (() => {
2 let ready = true;
3 return setInterval(
4 () => {
5 if (!ready) return;
6 ready = false;
7 update();
8 setTimeout(() => ready = true, (10 * 1000));
9 },
10 50
11 );
12)();
13
14// 止めたくなったらこれを実行すればお行儀よく停止できそう
15process.on("SIGINT", () => {
16 creaInterval(id);
17});
そこでわかり易さ重視で
Promise→async/awaitを併用したパターンで作ってみました。
js
1// 覚えさせたいデータがあれば外のスコープに変数を準備
2const state = {
3 foo: null,
4 update: true,
5};
6
7// async関数を定義して返り値をPromiseにする
8const update = async () => {
9 // こんな感じで値を書き出す
10 state.foo = [];
11
12 for (let i = 0; i < 20/*変動値*/; i++) {
13 const hoge = new HogeHoge(options);
14
15 state.foo.push(hoge.awesomeCalc());
16 }
17}
18
19// setTimeoutをラッピングしたPromise版のsetTimeoutを実装
20const timeout = ms =>
21 new Promise(resolve => setTimeout(resolve, ms));
22
23// asyncのアロー関数を定義して即時実行
24// これによりawait構文を有効にして待てるようにする
25(async () => {
26 while (state.update) {
27 // await Promiseインスタンスと記述すると、
28 // Promiseの動作が全て完了するのを待ってくれる挙動をする
29 await update();
30 await timeout(1000 * 10);
31 }
32})();
33
34process.on("SIGINT", () => {
35 state.update = false;
36});
JS・Node.jsのガベージコレクトの動作対象は参照の切れた値です
こうすればスコープがネストせず自然に参照が切れるので、
hoge達はいずれガベージコレクトのお掃除で消えてなくなるかと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。