为什么这段代码使用了这么多内存?

时间:2015-08-05 09:06:36

标签: javascript

我开始解决一些代码测试问题,即使问题的速度得分一般很好,内存也很低。

你能帮帮我吗?为什么这段代码使用了这么多内存(6392809 MEMORY,BYTES)?

var fs  = require("fs");
fs.readFileSync(process.argv[2]).toString().split('\n').forEach(function (line) {
    if (line != "") {
       console.log( line.split(' ').map(function(item){
            return item.substr(-1) + item.substr(1, item.length-2) + item[0];
        }).join(' '));
    }
});

SWAP NUMBERS 挑战描述:

编写一个程序,给定一个句子,其中每个单词都有一个单位正整数作为前缀和后缀,交换数字,同时保留其间的单词。句子中的单词用空格分隔。

INPUT SAMPLE:

第一个参数是文件的路径。输入文件的每一行包含一个由句子表示的测试用例。句子中的每个单词以单个数字正整数开始和结束,即0到9.假设所有字符都是ASCII。

4Always0 5look8 4on9 7the2 4bright8 9side7 3of8 5life5
5Nobody5 7expects3 5the4 6Spanish4 9inquisition0

输出样本:

对于每个测试用例,打印到标准输出通过交换每个单词周围的数字获得的句子,每行一个。

0Always4 8look5 9on4 2the7 8bright4 7side9 8of3 5life5
5Nobody5 3expects7 4the5 4Spanish6 0inquisition9

约束:

每个单词的后缀和前缀可以相等。 句子长度为1到17个单词。 测试用例数为40。

我想尝试提高记忆分数,欢迎任何提示。

3 个答案:

答案 0 :(得分:5)

我认为这会立即在整个文件中读取:fs.readFileSync(process.argv[2]).toString()因此至少会占用RAM中文件的大小。

尝试event-based approach

答案 1 :(得分:3)

我敢打赌你的问题是你把整个文件加载到内存中。其他建议您以某种形式逐行阅读,但这可能没有帮助。测试人员只需1行即可输入巨大的文件,但最终仍会占用大量内存。您最好的方法是以块的形式读取文件。使用fs.readSync(这里不需要异步内容)。你应该处理单词,这样你就应该阅读chunk,交换单词中的单词并继续。当然,他们可能会在文件中放入一个巨大的单词,但这是一个复杂的下一层次。

答案 2 :(得分:2)

我建议使用正则表达式而不是所有代码。

如果你有一个小的或巨大的文件,那没关系。

只需删除所有代码并使用:

.replace(/(\d)([^\d]+)(\d)/g,'$3$2$1');

示例:



alert("4Always0 5look8 4on9 7the2 4bright8 9side7 3of8 5life5\n\
5Nobody5 7expects3 5the4 6Spanish4 9inquisition0".replace(/(\d)([^\d]+)(\d)/g,'$3$2$1'));




那很简单!

您的最终代码:

var fs  = require("fs");
var text = fs
    .readFileSync(process.argv[2])
    .toString() //is this really needed?
    .replace(/(\d)([^\d]+)(\d)/g,'$3$2$1');

这将减少内存使用量,因为您只需触摸字符串。请注意,这可能会将整个文件加载到内存中,这可能仍会显示高使用率。