Как бороться с «RangeError: Превышен максимальный размер стека вызовов» - PullRequest
0 голосов
/ 03 мая 2020

Я разрабатываю express API. Он хорошо работает на моем компьютере, но на моем сервере встречается следующее исключение:

RangeError: Превышен максимальный размер стека вызовов

Код состоит в чтении файла ~ 400000 строк. Затем он зацикливается на каждой строке и имеет рекурсивный вызов глубиной не более 15. Я читал о setImmediate и process.nextTick, но я не уверен, как или где их использовать.

Есть идеи о том, что происходит и как это исправить?

Я уже пробовал изменить размер стека (до размера моего файла), но это не решает эту проблему. Я полагаю, это скорее структурная проблема.

Пример кода

const bigProcess = () => {
    const processLine = (line) => {
        let l = line && line.charAt(0);
        if (l) {
            if (line.length > 1) {
                processLine(line.substring(1));
            } else {
                console.log('line processed.');
            }
        }
    };

    var data = fs.readFileSync("myfile.txt", "utf-8");
    var lines = data.toString().split("\r\n");
    for (var line of lines) {
        processLine(line);
    }
};

Вот мой полный вывод:

RangeError: Максимальный вызов превышен размер стека в String.charAt () в processLine (/home/sinsedrix/myapi/bigprocess.js:7:30) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/ home / sinsedrix / myapi / bigprocess) . js: 14: 17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/ home / sinsedrix / myapi / bigprocess) . js: 14: 17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/ home / sinsedrix / myapi / bi gprocess. js: 14: 17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/ home / sinsedrix / myapi /) bigprocess. js: 14: 17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) в processLine (/home/sinsedrix/myapi/bigprocess.js:14:17) at processLine (/home/sinsedrix/myapi/bigprocess.js:14:17)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...