字符串操作导致Node.js内存不足错误

时间:2018-10-24 19:44:03

标签: javascript node.js algorithm v8

给出字符串s,将其分配n次,长度为x。示例:如果n = 7s = "ada",则最后一个字符串为adaadaa。最后,计算字符串中a的数量。

我的解决方案可以在下面找到。除API fatal error handler returned after process out of memory或更高时遇到n = 10000000错误外,它工作正常。

这是为什么?如果n=100000正常工作,会导致JavaScript的字符串操作用尽,这是怎么回事?它与引擎试图赋予它int类型(而它应该很长)有关吗?

const s = "a";
const n = 100000000;

let count = 0;
let output = "";
for (let i = 0; i < n; i++) {
    if (count % s.length == 0) {
        count = 0;
    }
    output += s[count];
    count++;
}

let finalCount = 0;
let arr = output.split('');
for (let i = 0; i < arr.length; i++) {
    if (arr[i] == 'a') {
        finalCount++;
    }
}

console.log(finalCount);

2 个答案:

答案 0 :(得分:2)

  

有关javascript中导致其内存不足的字符串操作是什么?

您只是在构建一个巨大的巨大字符串。这样的字符串需要驻留在内存中的某个位置。您的字符串太大。

您可以优化算法,使其不需要那么大的字符串(在此示例中,我什至也认为它是简化):

const s = "a";
const n = 100000000;

let count = 0;
let finalCount = 0;
for (let i = 0; i < n; i++) {
    if (count % s.length == 0) {
        count = 0;
    }
    if (s[count] == 'a') {
        finalCount++;
    }
    count++;
}

console.log(finalCount);

(您可以进一步优化,使其在n之前不需要循环,但可以在O(s.length)中运行,但这对于减少内存使用量不是必需的。)

答案 1 :(得分:0)

您还可以增加nodejs的最大内存大小,默认情况下将其设置为1 gb,有关如何增加大小的信息,请参见下面的链接。您已经达到了极限,它的nodejs极限不是JavaScript极限。

https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c

此外, 在您的第一个for循环中,您有一条if语句,用于检查count(在第一个循环后等于1)除以1的余数是否为1,如果是,则将count设置为0,然后在输出中添加“ a”然后将count设置为1,以使整个循环再次运行。